2013-08-27 31 views
2

我試圖調試一個libgdx應用程序......顯然,我在某個時間點產生了一個NullPointerException,但是libgdx有一個巨大的try-catch語句捕獲我的原始異常:libgdx捕獲所有的異常,只提供RuntimeException而不是原始的

 public void run() { 
      graphics.setVSync(graphics.config.vSyncEnabled); 
      try { 
       LwjglApplication.this.mainLoop(); 
      } catch (Throwable t) { 
       if (audio != null) audio.dispose(); 
       if (t instanceof RuntimeException) 
        throw (RuntimeException)t; 
       else 
        throw new GdxRuntimeException(t); 
      } 
     } 

因此,調試器停止在引發(Gdx)RuntimeException的catch語句中。我知道t包含了原始的異常,但我無法確定它來自哪裏。有沒有什麼辦法可以在產生異常的線上破解?

回答

0

這是工作的解決方案:添加顯示在T到例外列表中的例外,應始終觸發調試器,即使被逮住:

Break when exception is thrown

感謝您的幫助雖然:)

0

未經測試與libgdx但在類似的系統,你可能能夠做到......

try { 
    foo.run() 
} catch (RuntimeException t) { 
    System.err.println ("** Caught a runtime exception."); 
    t.printStackTrace(); 
    Throwable tCause = t; 
    while (tCause = tCause.getCause()) { 
     System.err.println("→ caused by:"); 
     t.getCause.printStackTrace(); 
    } 
} 

看來,GdxException.GdxException (Throwable)應該叫super (t)這反過來應該「藏」 t在屬性爲getCause訪問。

PS:你有沒有試過運行一個像FindBugs這樣的靜態分析器來找到潛在的NPE?

+0

在這種情況下t的原因字段是對t本身的引用。此外,我粘貼的代碼是從libgdx庫中獲取的,我試圖搗亂它們的源代碼,但只是爲了在更新時不會遇到問題而使用它。 /編輯 從未使用過靜態分析儀。我會嘗試FindBugs,看看是否有幫助。我仍然認爲我應該以某種方式找到異常的來源,儘管我的程序崩潰... – Jay

+0

我不知道他們是如何管理的?非常奇怪。您可能想切換到不具有該特定錯誤的'libgdx'的不同版本。 – BRFennPocock

0

inspecting the stacktrace怎麼樣,並插入一個斷點生成NullPointerException

+0

是的,t的堆棧跟蹤也是我的第一個想法。問題是stacktrace看起來像這樣:「org.eclipse.debug.core.DebugException:com.sun.jdi.ClassNotLoadedException:在檢索數組的組件類型時未發生類型加載。」沒有更多信息。這並不完全幫助我在生成NPE的代碼中找到該點。正如我所說,我真的不知道它是從哪裏來的,這正是我試圖找到的結果: -/ – Jay

+0

聽起來像日食是困惑的。你檢查[this](http://stackoverflow.com/questions/1367730/how-do-i-deal-with-a-classnotloadedexception-while-debugging)? – Aert

+0

不是真的......「要麼你需要重新編譯來獲得行號同步或其他問題正在進行」雖然並不真正幫助。清理項目並重新編譯它們不會改變問題。 – Jay

相關問題