我有一個NullPointerException的問題,我真的不明白。Java - LinkedList:奇怪的空指針異常
我的代碼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事件= eventList.get(0); ]
該類實現了一個接口,允許其他類通過調用SignalValueChanged方法來通知它。
所以基本上我的LinkedList是在類的初始化時創建的,每當需要將事件放入列表中時由外部類填充,並且調用方法循環查看列表中是否有任何內容。如果有,則處理並刪除事件。
我測試過這一點,我應該有一個NPException的唯一原因是,如果我的列表等於空...但我不這樣做,在任何地方我的代碼...
正如我所說的這段代碼是全天候工作的,而且我在開始應用程序後將近一週半的時間裏有這個bug。這是顯而易見的,我失蹤了嗎?
非常感謝你讀這篇文章,如果你能幫助我,氣墊船全鰻魚提出上述,我猜,這是一個併發的問題,我會很高興:)
1)哪一行是97行? 'ScenarioWorker.java:97' 2)代碼在每次運行中是否失敗,或者是間歇性的? 3)如果間歇性地發生,則這表明併發問題。你確定你的代碼是線程安全的嗎? –
@HovercraftFullOfEels:第97行是SignalValueEvent event = eventList.get(0);我將編輯我的帖子以反映這一點。 問題是intermitent,我認爲LinkedList是線程安全的?.. – Caerbannog
我也認爲這是一個併發問題,因爲不規則的失敗 – AhmadWabbi