【问题标题】:How to debug Android/Java in Eclipse如何在 Eclipse 中调试 Android/Java
【发布时间】:2010-12-24 19:27:05
【问题描述】:

当我注释掉 calc1.setOnClickListener(buttonListener); 时,它运行良好,当我允许它运行时,它会使我的脚本崩溃。我怎样才能弄清楚发生了什么? Logcat显示一堆红色,但我不知道怎么看...

package com.example.contactwidget;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ContactWidget extends Activity {

    private static final int HELLO_ID = 1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button calc1 = (Button) findViewById(R.id.calc_button_1);

        OnClickListener buttonListener = new View.OnClickListener() {
          public void onClick(View v) {

          }
        };

        calc1.setOnClickListener(buttonListener);

        setContentView(R.layout.main);
    }
}

更新

堆栈跟踪...

E/AndroidRuntime(  339): FATAL EXCEPTION: main
E/AndroidRuntime(  339): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.contactwidget/com.example.contactwidget.ContactWidget}: java.lang.NullPointerException
E/AndroidRuntime(  339):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  339):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  339):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  339):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  339):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  339):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  339):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  339):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  339):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  339):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  339):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  339):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  339): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  339):    at com.example.contactwidget.ContactWidget.onCreate(ContactWidget.java:41)
E/AndroidRuntime(  339):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  339):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(  339):    ... 11 more

【问题讨论】:

  • “Logcat 显示一堆红色,但我不知道如何阅读...”在这里发布堆栈跟踪,我们可以帮助您阅读。
  • 你为什么要-1这个?史诗般的失败

标签: android eclipse debugging


【解决方案1】:

ccheneson's answer 对于您的具体情况可能是正确的。

根据您的堆栈跟踪,您正在运行 NullPointerException。一个更容易跟踪这些的好方法是为所有未捕获的 NullPointerExceptions 添加一个 Java 异常断点。 (我还建议打破 ArrayIndexOutOfBoundsException、IllegalArgumentException 和 IllegalStateException)。

为此,请转到 Debug 透视图(Window -> Open Perspective -> Debug 或 Other,然后 Debug),找到 Breakpoints 窗格(默认情况下,它与 Variables 窗格组合在一起,右上角),然后单击 J !图标。下次遇到此异常时,您将能够准确地看到它发生的位置,而不必筛选 RuntimeException 输出。

【讨论】:

    【解决方案2】:

    其他人可能知道如何解决这个问题,但我太新了,不知道 - 不过我可以帮助调试。

    如果你想通过 LogCat 进行调试,我建议创建一个过滤器。您可以通过单击 LogCat 视图中的绿色 + 并输入您要过滤的规则来执行此操作。我所做的是将我的所有日​​志语句放在某个标志下 [ Log.d(DEBUGTAG, message); ] 这样我就可以将过滤器设置为只查找这些标签而不显示其他任何内容。

    如果您想通过逐步调试应用程序,您可以通过双击行号左侧的栏来设置断点,以指示您希望它停止的位置 - 一个小蓝点应该出现。然后,当您使用“调试”按钮运行程序时,它会一直运行,直到遇到该断点。您现在可以使用 F6 键跳到下一行。 F5 将单步进入函数。您还可以查看对象的当前值等。

    希望这会有所帮助 - 正如我所说,我对此也很陌生。大量的边学边学。

    【讨论】:

    • 问题是,我没有记录任何东西。那是问题吗?我想我只是假设它会抛出一个解析错误或类似 PHP 的更简单的东西,但事实并非如此。
    • 你的代码是预编译的,不像 PHP 是被解释的,所以如果你让它运行起来,那么解析你的代码就没有问题。它引发了一个异常,该异常将在 LogCat 中显示为堆栈跟踪。您只需要花时间阅读该堆栈跟踪,它就会告诉您导致问题的确切行号。
    • 所有行号都不在我的代码中,除了 1....不是那么我如何为它添加一个监听器?
    【解决方案3】:

    有一件事是你最后打电话给setContentView(R.layout.main);。 在引用 xml 布局中的任何视图之前,您必须如上所述设置内容视图

     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Button calc1 = (Button) findViewById(R.id.calc_button_1);
    
            OnClickListener buttonListener = new View.OnClickListener() {
              public void onClick(View v) {
    
              }
            };
    
            calc1.setOnClickListener(buttonListener);
        }
    

    由于您尝试通过 id 查找视图而之前未指定任何布局(使用 setContentView(R.layout.main);),因此它返回一个空对象 calc1

    【讨论】:

    • @ccheneson 你怎么能从这个堆栈跟踪中找出错误的位置?如果我制作 XML 布局,堆栈跟踪对我来说似乎没用。
    • @sydd :堆栈跟踪只会为您提供 NPE 发生的位置。从那里,您必须上去检查您是否正确完成了所有操作,例如 setContentView 的缺失/错误位置,如果您从正确的上下文中使用 findViewById...
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多