【问题标题】:How can I know where a Null Pointer Exception originated?我如何知道空指针异常的来源?
【发布时间】:2010-04-15 11:30:57
【问题描述】:

我在制作 Blackberry 应用程序时遇到问题。我找到了一些人,他做了一个教程,做了我尝试过的事情。我复制了教程应用程序的代码来尝试重新创建它,只是为了看看它的实际效果。结果:空指针异常。

我想知道是什么触发了这个。我该怎么办?

【问题讨论】:

标签: java blackberry nullpointerexception


【解决方案1】:

如果您捕获 Throwable 而不是捕获 Exception 或 Exception 的任何子类,则可以查看堆栈跟踪。例如

try
{
   //some code
}
catch(Throwable t)
{
    //Will automatically show a stacktrace in eclipse.  
    //I believe on a real device it will put the stacktrace in the eventlog.  
}

【讨论】:

    【解决方案2】:

    黑莓中没有堆栈跟踪,最好是使用Debug模式,这样当异常发生时应用程序会break

    人们建议这样做

    try {
        // Code that throws an exception
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    这在 BlackBerry 上不起作用,您需要改用它

    System.out.println(e.getMessage());
    

    但由于它只显示异常,它不会告诉你发生错误的行,你必须在println中添加其他信息。

    在真实设备上,您可以通过 this 访问 StackTrace:

    转到主屏幕并输入后门序列 LGLG。然后过滤日志并找到异常条目。然后,您可以复制并通过电子邮件发送跟踪。

    我在 RIM 网站上能找到的最好的就是 document

    【讨论】:

    • +1。为什么 BB 上没有堆栈跟踪? BB Jvm 不支持它们吗?
    • @pajton 我希望我知道这个问题的答案:P
    • 嗯,它是 java 对吧?因此您也可以在 PC 上运行您的应用程序。错误是可重复的吗?这可能会给你一些线索,因为迈克尔说没有堆栈跟踪。但 PC 有。
    • @Matt H 如果您知道如何在 PC 上运行 BlackBerry Code,请告诉我。
    • 您是否尝试过在黑莓智能手机模拟器上打印堆栈跟踪?他们的文档似乎表明 printStackTrace 有效
    【解决方案3】:

    好吧,我不能把这归功于这个,但这个帖子似乎给出了答案。

    更改您的 catch 块以捕获 Throwable 而不是特定的异常。这将保留堆栈跟踪并将其添加到事件日志中。

    http://supportforums.blackberry.com/t5/Java-Development/How-to-get-stacktrace-from-a-real-device/m-p/27668

    另外,请尝试在黑莓智能手机模拟器上运行您的应用程序,而不是在您的真手机上运行,​​因为黑莓在其文档中指出您可以调用 printStackTrace 函数。

    【讨论】:

      【解决方案4】:

      在黑莓中查找 NPE 发起者很容易。 例如

      1.在任何地方插入此代码。

      字符串临时=空; temp.length();

      1. 从 Eclipse 以调试模式启动模拟器。
      2. 当你到达这段代码时,eclipse会自动暂停代码的执行 和 temp.length(); 这行将突出显示为绿色。
      3. 在调试窗口你可以看到挂起的异常空指针异常。

      【讨论】:

        【解决方案5】:

        您应该能够查看异常的堆栈跟踪。

        您可以将其打印到控制台,执行如下操作:

        try {
            // Code that throws an exception
        } catch (Exception e) {
            e.printStackTrace();
        }
        

        注意:这绝不应该出现在生产代码中!

        【讨论】:

        • 重点是,堆栈跟踪不只是打印在 BlackBerry 上。我也在为黑莓开发,想知道如何打印它们。相反,您得到的只是打印了“无堆栈跟踪”。
        • 这个不行,需要使用System.out.println(e.getMessage());
        • 当然,但我只是收到消息而不是堆栈跟踪。你知道如何打印堆栈跟踪吗?好的,我看到你发布了一个答案,谢谢。
        【解决方案6】:

        程序崩溃时查看stack trace。它会告诉您异常源自何处(通常是哪一行代码,如果可用)以及哪个对象为空。

        如果您没有看到堆栈跟踪,请用 OMG Unicorns suggests 包围您的 main 方法中的所有内容。

        【讨论】:

        • 黑莓上没有 StackTrace,这永远不会显示。
        【解决方案7】:

        我不知道黑莓,但一般来说,异常都有一个堆栈跟踪,其中显示了行号:

        java.lang.NullPointerException
            at your.packege.ClassName.methodName(ClassName.java:169)
        

        所以获取堆栈跟踪并查看。堆栈跟踪是通过

        获得的
        try {..} catch (Exception ex) {..}
        

        或者让它冒泡到打印到标准输出的地方。

        此外,每个异常都有getStackTrace() 方法,它将堆栈跟踪的每一行作为StackTraceElement 返回

        【讨论】:

        • 黑莓上没有 StackTrace,这永远不会显示。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 2016-11-07
        相关资源
        最近更新 更多