我对一个NullPointerException有些困惑,不太理解它的原因。
我的代码运行24/7,表现良好,但是这个异常会在应用程序启动后的1天到1周内随机出现。
以下是堆栈跟踪:
我的代码运行24/7,表现良好,但是这个异常会在应用程序启动后的1天到1周内随机出现。
以下是堆栈跟踪:
java.lang.NullPointerException
at java.util.LinkedList.get(LinkedList.java:477)
at com.ch4process.acquisition.ScenarioWorker.eventHandling(ScenarioWorker.java:97)
at com.ch4process.acquisition.ScenarioWorker.call(ScenarioWorker.java:79)
at com.ch4process.acquisition.ScenarioWorker.call(ScenarioWorker.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
正如您所看到的,这个异常是在一个线程中引发的。
以下是简化后的代码:
public class ScenarioWorker implement Callable<Integer>
{
List<SignalValueEvent> eventList = new LinkedList<>();
boolean busy = false;
@Override
public Integer call() throws Exception
{
try
{
while (true)
{
eventHandling();
Thread.sleep(1000);
}
}
catch (Exception ex)
{
// Redirects the exception to a custom class
}
}
private void eventHandling()
{
if (! busy)
{
while (eventList.size() > 0)
{
SignalValueEvent event = eventList.get(0); // NullPointerException here according to stacktrace
if(event.isTriggered()))
{
busy = true;
doScenario(event);
}
deleteEvent();
}
}
}
private void deleteEvent()
{
try
{
eventList.remove(0);
}
catch (Exception ex)
{
// Redirects the exception to custom class
}
finally
{
busy = false;
}
}
@Override
public void SignalValueChanged(SignalValueEvent event)
{
if (event.isValid())
{
eventList.add(event);
}
}
}
[编辑:堆栈跟踪中的第97行是说SignalValueEvent event = eventList.get(0);]
这个类实现了一个接口,允许另一个类通过调用SignalValueChanged方法来通知它。
因此,基本上我的LinkedList在类的初始化时被创建,在外部类需要将事件放入列表时被填充,而调用方法循环遍历列表以查看是否有任何内容。如果有,就会处理它并删除事件。
我已经测试过了,唯一可能导致NPException的原因是我的列表等于null...但我在代码中没有这样做...
正如我所说,这段代码全天候工作,我在启动应用程序后的一周半左右才发现了这个错误。我是否漏掉了什么显而易见的东西?
非常感谢您阅读这篇文章,如果您能帮助我,我将不胜感激 :)
ScenarioWorker.java:97