在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在哪里,因为我的活动失败了。
答案 0 :(得分:1)
一些评论也提出了三种可能的情况:
您正在谈论的NPE被捕获在try-catch块中,您所指的输出是由您(或第三方)自己的代码生成的,即System.out.println(“This方法投了NPE“);
您正在编译没有调试信息的java文件。这是一个必须激活编译时间的标志(默认是使用调试信息编译)。
该特定位置的特定异常抛出了很多次,以至于JVM 优化了异常,在这种情况下,堆栈跟踪信息丢失(您通常看不到堆栈跟踪,只有一行) 。可以通过向JVM参数添加特定标志来禁用此功能。对于太阳jvm,它是-XX:-OmitStackTraceInFastThrow
答案 1 :(得分:1)
您可以在logcat输出中看到NullPointerException
以及正确的文件和行信息,因为"由"异常。
从Activity
onCreate()
等生命周期回调中抛出的异常包含在RuntimeException
中,而您发布的内容只是此包装器的堆栈跟踪。