我正在读取一个串行端口,并将其作为滚动值写入文本区域。我创建了运行良好的SerialPortReader类。我的主要代码只是简单地调用“ updateTextArea()”,以告诉类textarea在哪里。这可以工作一段时间,但是当我开始向串行端口中抛出更多数据时(比如说〜100字节),Java感觉到NullPointerException。如果我注释掉“ updateTextArea()”调用(〜第13行),那么也不例外。当我取消注释“ updateTextArea”时,该程序可以正常运行约一分钟。我怀疑textarea缓冲区已满,但是我不知道如何增加缓冲区的大小或如何使新文本将旧文本推出缓冲区。
打印到控制台对于(大概)永远来说都可以。我只运行了约10分钟,但还没有打h。
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)
感谢您的见解!
Ĵ
最佳答案
我不确定这是否导致空指针异常,但是您需要更新FX Application Thread上的文本区域。你应该更换
updateTextArea();
与
Platform.runLater(() -> updateTextArea());
或者,如果您仍在使用Java 7,
Platform.runLater(new Runnable() {
@Override
public void run() {
updateTextArea();
}
});