在 Java 中处理串行对象空指针异常

Processing in Java Serial object Null Pointer Exception

首先,我是 Java 的新手,如果这是一个显而易见的答案,我深表歉意。

我正在使用 Java 中的 Processing 来读取来自 USB 端口的输入值。

这是我为获取值而设置的自定义 class。我调用 getCurrentValue() 方法,它抛出 NullPointerException。

import processing.core.PApplet;
import processing.serial.*; 

import java.util.HashMap; 
import java.util.ArrayList; 
import java.io.File; 
import java.io.BufferedReader; 
import java.io.PrintWriter; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

public class Seismograph extends PApplet{

    private int currentValue, verticalOffset = 0;
    private int zero = 32768;                                                                                      // .5 of maximum seismograph value
    private int adjustSeis = 68;                                                                                   // devide seismograph data by adjustSies to scale
    public String theSeisPort = "COM20";
    private Serial seisPort;  

    public void Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
    }


    public int getCurrentValue(){
        byte[] inBuffer = new byte[2];                                                                       // value for seis - 2 bytes

        while (seisPort.available() > 0) {                                                                   // verify serial port
          inBuffer = seisPort.readBytes();
          seisPort.readBytes(inBuffer);                                                                      // read bytes into buffer

        if (inBuffer != null)  {
            String seisString = new String(inBuffer);                                                        // capture value
            float seisFloat = PApplet.parseFloat(seisString);                                                             // convert value to float
            int seisInt = PApplet.parseInt((seisFloat-zero)/adjustSeis);                                                  // adjust data to fit screen
            seisInt = seisInt+(height/2)-verticalOffset;                                                     // center data vertically
            currentValue = seisInt;
            }

        }
        return this.currentValue;
    }
}

由于第 40 行 seisPort.available() 而引发错误 错误信息:

Exception in thread "Animation Thread" java.lang.RuntimeException: java.lang.NullPointerException
    at com.jogamp.common.util.awt.AWTEDTExecutor.invoke(AWTEDTExecutor.java:58)
    at jogamp.opengl.awt.AWTThreadingPlugin.invokeOnOpenGLThread(AWTThreadingPlugin.java:103)
    at jogamp.opengl.ThreadingImpl.invokeOnOpenGLThread(ThreadingImpl.java:206)
    at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:172)
    at javax.media.opengl.Threading.invoke(Threading.java:191)
    at javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:541)
    at processing.opengl.PJOGL.requestDraw(PJOGL.java:688)
    at processing.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1651)
    at vialab.SMT.renderer.PGraphics3DDelegate.requestDraw(PGraphics3DDelegate.java:1450)
    at processing.core.PApplet.run(PApplet.java:2254)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.NullPointerException
    at seismic.Seismograph.getCurrentValue(Seismograph.java:40)
    at seismic.seismograph_jan22c_1_1.draw(seismograph_jan22c_1_1.java:102)
    at processing.core.PApplet.handleDraw(PApplet.java:2384)
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862)
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665)
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649)
    at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1289)
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119)
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994)
    at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1300)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access0(EventQueue.java:103)
    at java.awt.EventQueue.run(EventQueue.java:694)
    at java.awt.EventQueue.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

我已经坚持了一段时间,欢迎任何反馈。

看看你的构造函数:

public void Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
}

请注意,您在方法签名中包含了 void 关键字。构造函数没有 return 类型,因此这将被视为 方法 而不是构造函数。当您创建 Seismograph 的新实例时,这 不会 被调用,因此您的 seisPort 为空。

要解决此问题,只需删除 void 关键字即可。

public Seismograph(){
      currentValue = 0;
      seisPort = new Serial(this, "COM20", 38400);
}

构造函数的签名中不应包含 void。由于 java 没有看到有效的构造函数,它创建了一个空的构造函数,称为默认构造函数。因此,创建实例时不会初始化 seisPort,引用它会导致 java 抛出 NullPointerException.