我正在使用jSerialComm库与SerialPort进行通信。我已经写了一个SerialDataListener,以重写的serialEvent方法读取字节,如下所示:
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) return;
int numBytesAvailable = serialPort.bytesAvailable();
if (numBytesAvailable < 0) {
logger.error("Port is not open.. returning without any action");
return;
}
byte[] newData = new byte[numBytesAvailable];
int readData = serialPort.readBytes(newData, numBytesAvailable);
for (int i = 0; i < numBytesAvailable; i++) {
byte b = newData[i];
logger.info("Starting new response");
response = new Response();
response.addByte(b);
}
}
现在,如果我确实接收到数据,并且随后的代码以某种方式进入NUllPointerException(例如,响应的构造函数被调用并抛出NPE),则说明SerialPort已在库的SerialPort类中编程为
别听了
吞下异常
由于1和2,无法再处理到达SerialPort的数据。没有公开的API来查看侦听器是否已停止并重新启动它。我无法采取任何措施,例如重新打开SerialPort。
这是这段代码:
//Line 895 of the class SerialPort) (from dependency: com.fazecast:jSerialComm:1.3.11).
while (isListening && isOpened) { try { waitForSerialEvent(); } catch (NullPointerException e) { isListening = false; } }
这里是问题:
为什么吞下了异常并在库中停止了监听?有设计上的原因吗?
SerialPort类本身是
final
,因此毫无疑问要编写我自己的类实现来代替燕子。我该如何进行?除此问题外,jSerialComm似乎还可以很好地满足大多数其他用例,因此我可能不会在不久的将来从中迁移过来。一种方法是自己抓住它并进行处理。但是除非第一季度的答案很明确,否则我不想这样做。我试图进行调查,但没有发现任何禁用监听和不宣布例外的实际原因。
为什么只是NPE,也可能会出现其他例外情况。因此,至少,我将不得不自己处理异常。那么我自己的处理程序的这种方法正确吗?
TIA
拉胡尔
最佳答案
1)为什么在库中吞下了异常并停止了监听?有设计上的原因吗?
您需要询问代码的作者。
但是,这似乎是故意的,因为waitForSerialEvent
被声明为throws NullPointerException
。
如果我是你,我将更深入地探讨NPE的投掷地点和原因。修改代码以打印堆栈跟踪信息,而不是完全挤压异常。这可能是“黑客”解决方法,或者这样做有正当理由。
如果我们假设客户端的侦听器代码可以抛出NPE,那么在我看来,事件线程假定可以压缩所有NPE是错误的。
但是查看代码,我还可以看到故意抛出NPE的地方(显然)表明存在错误;例如在read
中的SerialPortInputStream
方法中。因此,对我来说,尚不清楚NPE是否应被完全压制。
2)SerialPort类本身是最终的,因此编写自己的类以替换燕子的实现是毫无疑问的。我该如何进行?
该代码位于GitHub上,因此您可以派生存储库,开发补丁并提交拉取请求。
4)为什么只是NPE,也会出现其他例外情况。因此,至少,我将不得不自己处理异常。那么我自己的处理程序的这种方法正确吗?
好问题。
但是,实际上,所有这些问题都最好由代码作者解决。他似乎确实回答了作为问题发布的问题……如果它们是相关的。
关于java - jSerialComm中没有异常句柄?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50037036/