在 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
.
首先,我是 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
.