gpt4 book ai didi

java - jSerialComm 中没有异常句柄?

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:43 25 4
gpt4 key购买 nike

我正在使用 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. 接受异常
  3. 由于 1 和 2,无法再处理到达串行端口的更多数据。没有公开的 API 来查看监听器是否停止并重新启动它。我无法采取任何操作,例如重新打开串行端口。

这是一段代码:

//Line 895 of the class SerialPort) (from dependency:  com.fazecast:jSerialComm:1.3.11).

while (isListening && isOpened) { try { waitForSerialEvent(); } catch (NullPointerException e) { isListening = false; } }

问题如下:

  1. 为什么异常被吞没并且图书馆内的监听停止了?有什么设计原因吗?
  2. SerialPort 类本身是final,因此编写我自己的类实现来替换燕子是毫无疑问的。我该如何继续?除了这个问题之外,jSerialComm 似乎可以很好地满足大多数其他用例,因此我可能不会很快从它迁移。
  3. 一种方法是自己捕获并进行处理。但除非第一个问题的答案很明确,否则我不想这样做。我曾尝试调查,但没有发现任何禁用监听且不宣布异常的实际原因。
  4. 为什么只是 NPE,其他异常也可能出现。那么至少,我必须自己处理异常。那么我自己的处理程序的这种做法正确吗?

TIA拉胡尔

最佳答案

1) Why was the exception swallowed and listening stopped inside the library? Are there any design reasons?

您需要询问代码的作者。

但是,这似乎是有意为之,因为 waitForSerialEvent 被声明为抛出 NullPointerException

如果我是你,我会更深入地研究 NPE 被抛出的位置以及原因。修改代码以打印堆栈跟踪,而不是完全消除异常。这可能是一种“黑客”解决方法,或者可能有这样做的合法理由。

如果我们假设客户端的监听器代码可能会抛出 NPE,那么在我看来,事件线程假设所有 NPE 都可以被压缩是错误的。

但是查看代码,我还可以看到故意抛出 NPE 来(显然)发出错误信号的地方;例如在 SerialPortInputStreamread 方法中。因此,我并不清楚 NPE 是否应该被压制。

2) The SerialPort class itself is final and hence writing my own implementation of the class to replace the swallow is out of question. How do I proceed?

代码位于 GitHub 上,因此您可以 fork 存储库、开发补丁并提交拉取请求。

4) Why just a NPE, other exceptions could arise too. So then at least, I will have to handle the exceptions myself. Is this approach of my own handlers correct then?

好问题。

<小时/>

但实际上,所有这些问题最好向代码作者提出。他似乎确实回应了作为问题发布的问题……如果它们相关的话。

关于java - jSerialComm 中没有异常句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50037036/

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