【问题标题】:libgdx catches all exceptions, only presents RuntimeException instead of original onelibgdx 捕获所有异常,仅呈现 RuntimeException 而不是原始异常
【发布时间】:2013-08-30 08:48:08
【问题描述】:

我正在尝试调试 libgdx 应用程序...显然,我在某些时候会产生 NullPointerException,但 libgdx 有一个巨大的 try-catch 语句来捕获我原来的异常:

        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 包含原始异常,但我真的不知道它来自哪里。有什么办法可以打破产生该异常的行吗?

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    未经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?

    【讨论】:

    • 在这种情况下,t 的原因字段是对 t 本身的引用。此外,我粘贴的代码是从 libgdx 库中获取的,我试图弄乱他们的源代码,但只是为了在更新时不会遇到问题而使用它。 /edit 从未使用过静态分析器。我会试试 FindBugs 看看是否有帮助。我仍然认为我应该能够以某种方式找到导致我的程序崩溃的异常的来源......
    • 我想知道他们是怎么做到的?很奇怪。您可能希望切换到没有特定错误的 libgdx 的不同版本。
    【解决方案2】:

    inspecting the stacktrace 并在生成NullPointerException 的位置插入断点怎么样?

    【讨论】:

    • 是的,t 的堆栈跟踪也是我的第一个想法。问题是堆栈跟踪看起来像这样:“org.eclipse.debug.core.DebugException:com.sun.jdi.ClassNotLoadedException:在检索数组的组件类型时发生类型未加载。”。没有进一步的信息。这并不能完全帮助我在我的代码中找到生成 NPE 的点。正如我所说,我真的不知道它来自哪里,这正是我想要找出的:-/
    • 听起来 eclipse 很困惑。你检查this了吗?
    • 不是真的...“要么您需要重新编译以使行号同步,要么正在发生其他问题”并没有真正的帮助。清理项目并重新编译它们不会改变问题。
    【解决方案3】:

    这是行之有效的解决方案:将 t 中显示的异常添加到应始终触发调试器的异常列表中,即使被捕获也是如此:

    Break when exception is thrown

    感谢您的帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2018-11-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2012-08-31
      相关资源
      最近更新 更多