我正在使用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/

10-15 19:07