我正在读取一个串口并将其作为滚动值写入文本区域。我创建了SerialPortReader类,它运行良好。我的主代码只是调用“updateTextArea()”来告诉类textarea的位置。这工作将持续一段时间,但是当我开始向串口输入更多数据时 - 比如~100字节 - Java感觉NullPointerException。如果我注释掉“updateTextArea()”调用(〜第13行),那么就没有异常。当我取消注释“updateTextArea”时,该程序可以完美地工作大约一分钟。我怀疑textarea缓冲区正在填满,但我不知道如何增加缓冲区大小或如何使新文本将旧文本推出缓冲区。
打印到控制台工作正常 - 大概 - 永远。我只跑了大约10分钟,但它并没有那么多打嗝。
class SerialPortReader implements SerialPortEventListener {
byte[] serialData;
TextArea textArea;
@Override
public void serialEvent(SerialPortEvent event) {
try{
serialData = serialPort.readBytes();
for(byte dataReceived: serialData){
System.out.println("Byte Received: " + dataReceived);
}
updateTextArea();
} catch (SerialPortException ex){
System.out.println(ex);
}
}
public void initiateTextAreaUpdate(TextArea ta){
textArea = ta;
}
public void updateTextArea(){
if(textArea != null){
for(int i = 0; i < serialData.length; i++){
textArea.appendText(serialData[i] + "\n");
}
}
}
}
例外:
Exception in thread "EventThread COM5" java.lang.NullPointerException
at com.sun.javafx.sg.prism.NGTextHelper$TextAttributes.computeLinePadding(NGTextHelper.java:405)
at com.sun.javafx.sg.prism.NGTextHelper$TextAttributes.access$200(NGTextHelper.java:292)
at com.sun.javafx.sg.prism.NGTextHelper.buildTextLines(NGTextHelper.java:2357)
at com.sun.javafx.sg.prism.NGTextHelper.validateText(NGTextHelper.java:1847)
at com.sun.javafx.sg.prism.NGTextHelper.getCaretShape(NGTextHelper.java:1435)
at javafx.scene.text.Text.getDecorationShapes(Text.java:1150)
at javafx.scene.text.Text.impl_geomChanged(Text.java:757)
at javafx.scene.text.Text$1.invalidated(Text.java:214)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:127)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:161)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:67)
at javafx.scene.text.Text.setText(Text.java:188)
at com.sun.javafx.scene.control.skin.TextAreaSkin$17.invalidated(TextAreaSkin.java:610)
at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:359)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.scene.control.TextInputControl$TextProperty.fireValueChangedEvent(TextInputControl.java:1034)
at javafx.scene.control.TextInputControl$TextProperty.markInvalid(TextInputControl.java:1038)
at javafx.scene.control.TextInputControl$TextProperty.invalidate(TextInputControl.java:978)
at javafx.scene.control.TextInputControl$TextProperty.access$200(TextInputControl.java:950)
at javafx.scene.control.TextInputControl$1.invalidated(TextInputControl.java:119)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:155)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.scene.control.TextArea$TextAreaContent.insert(TextArea.java:196)
at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:373)
at javafx.scene.control.TextInputControl.insertText(TextInputControl.java:308)
at javafx.scene.control.TextInputControl.appendText(TextInputControl.java:298)
at mcsi.McsiGui$SerialPortReader.updateTextArea(McsiGui.java:489)
at mcsi.McsiGui$SerialPortReader.serialEvent(McsiGui.java:476)
at jssc.SerialPort$EventThread.run(SerialPort.java:1096)
感谢您的见解!
Ĵ
答案 0 :(得分:5)
我不确定这是否导致空指针异常,但您需要更新FX应用程序线程上的文本区域。你应该替换
updateTextArea();
与
Platform.runLater(() -> updateTextArea());
或者,如果您仍在使用Java 7,
Platform.runLater(new Runnable() {
@Override
public void run() {
updateTextArea();
}
});