gpt4 book ai didi

JavaFX TextArea.append() 导致 java.lang.NullPointerException

转载 作者:行者123 更新时间:2023-11-29 07:48:12 26 4
gpt4 key购买 nike

我正在读取串行端口并将其作为滚动值写入文本区域。我创建了运行良好的 SerialPortReader 类。我的主要代码只是调用“updateTextArea()”来告诉类文本区域在哪里。这会工作一段时间,但是当我开始将更多数据放入串行端口时 - 比如说 ~100 字节 - Java 会检测到 NullPointerException。如果我注释掉“updateTextArea()”调用(~第 13 行),那么也不异常(exception)。当我取消注释“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)

感谢您的见解!

j

最佳答案

我不确定这是否会导致空指针异常,但您需要更新 FX 应用程序线程上的文本区域。你应该更换

updateTextArea();

Platform.runLater(() -> updateTextArea());

或者,如果您仍在使用 Java 7,

Platform.runLater(new Runnable() {
@Override
public void run() {
updateTextArea();
}
});

关于JavaFX TextArea.append() 导致 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23573614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com