为什么空指针异常堆栈跟踪不显示它发生的行

时间:2015-05-22 09:49:11

标签: java android

javascript中,当堆栈跟踪中出现NullPointerException(某种类型)时,我可以看到它发生的方法和行。但是,在Java中,它只显示发生异常的方法的名称,而不指示哪个变量是Null或发生了哪一行。我想知道为什么存在这种差异?是因为Javascript是一种解释性语言,而Java被编译为字节码?编译时没有行或变量这样的东西吗?

更新

05-22 10:53:31.656  31583-31583/com.inreado.reader E/AndroidRuntime﹕ FATAL  
    EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.inreado.reader/com.inreado.reader.TextsListActivity}: java.lang.NullPointerException
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                at android.app.ActivityThread.access$600(ActivityThread.java:141)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)

当我转到ActivityThread.performLaunchActivity(ActivityThread.java:2180)时,它显示以下内容:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");

    ActivityInfo aInfo = r.activityInfo;
    if (r.packageInfo == null) {
        (this line is 2180) r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                Context.CONTEXT_INCLUDE_CODE);
    }

我不知道如何弄清楚NPE在哪里,因为我的活动失败了。

2 个答案:

答案 0 :(得分:1)

编辑:这是在提问者更新他的问题之前发布的,其中包括清除问题的实际日志输出。我将保留以下提示,因为它们通常对您的异常无法记录的情况有帮助。

一些评论也提出了三种可能的情况:

  • 您正在谈论的NPE被捕获在try-catch块中,您所指的输出是由您(或第三方)自己的代码生成的,即System.out.println(“This方法投了NPE“);

  • 您正在编译没有调试信息的java文件。这是一个必须激活编译时间的标志(默认是使用调试信息编译)。

  • 该特定位置的特定异常抛出了很多次,以至于JVM 优化了异常,在这种情况下,堆栈跟踪信息丢失(您通常看不到堆栈跟踪,只有一行) 。可以通过向JVM参数添加特定标志来禁用此功能。对于太阳jvm,它是-XX:-OmitStackTraceInFastThrow

答案 1 :(得分:1)

您可以在logcat输出中看到NullPointerException以及正确的文件和行信息,因为"由"异常。

Activity onCreate()等生命周期回调中抛出的异常包含在RuntimeException中,而您发布的内容只是此包装器的堆栈跟踪。