【问题标题】:What is the best way to debug the android code in Eclipse?在 Eclipse 中调试 android 代码的最佳方法是什么?
【发布时间】:2013-05-22 20:44:14
【问题描述】:

我刚开始接触 Eclipse,想知道是什么导致我的应用程序出错。我想知道他们是否像 Visual Studio 一样。

我的意思是我有空指针异常但即使在放置断点之后我也很困惑导致错误发生的原因。

因为我大部分时间都是新手,所以我运行不好或代码不起作用。我如何认识到我的错误。有时我的代码无法运行,并且很难找出我的代码发生的真正问题。

请有人检查代码并指导我如何找到它。我的意思是如何知道空指针异常发生在哪里。

public class MainActivity extends Activity {

    Set<String> tasks = new HashSet<String>();
    final String prefName = "andorid";
    SharedPreferences sp = getSharedPreferences(prefName, MODE_PRIVATE);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SetupApp();
    }

    // / Add the task in this function
    private void SetupApp() {

        tasks.add("blah");

        if (!sp.contains("tasks")) {
            Editor edit = sp.edit();

            edit.putStringSet("tasks", tasks);

            edit.commit();
        }

    }

    public void btnClick(View view) {

        EditText etxt = (EditText) findViewById(R.id.txtTask);

        tasks.add(etxt.getText().toString());

    }

    public void UpdateUI(String TaskName) {

        final ListView listview = (ListView) findViewById(R.id.listView1);

        Set<String> tasks = sp.getStringSet("tasks", new HashSet<String>());

        @SuppressWarnings("unchecked")
        ArrayList<String> taskarr = (ArrayList<String>) tasks;

        final ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < taskarr.size(); ++i) {
            list.add(taskarr.get(i));
        }
    }

    public void LoadTasks() {

    }

}

class StableArrayAdapter extends ArrayAdapter<String> {

    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

    public StableArrayAdapter(Context context, int textViewResourceId,
            List<String> objects) {
        super(context, textViewResourceId, objects);
        for (int i = 0; i < objects.size(); ++i) {
            mIdMap.put(objects.get(i), i);
        }
    }

    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}

【问题讨论】:

  • 为什么不看看logcat的输出看看NPE在哪里呢?仅查看代码并找出“NPE”与“它可能在此处或此处或此处或...”不同的地方有点困难
  • 发布您的 logcat,我们可以帮助您了解如何阅读它以找到错误
  • 如果您问我 logcat 是相当可怕的,但除非您交换 IDE,否则您必须使用它。从 logcat 复制时,请确保将其全部复制到文本文件中,因为很多时候没有显示一半的消息,然后仔细检查并找出问题所在,并将其设置为错误模式而不是详细
  • @MatthewPigram 嗯...我发现 logcat 非常有用,一旦你理解它就很容易阅读
  • @MatthewPigram 那么,就他/她的选择向 OP 提出建议吧。我不知道查看日志输出有什么不“直观”,或者 Eclipse 调试器有什么特别痛苦的地方:没有任何详细说明,你并没有真正帮助 OP。被截断的堆栈跟踪是因为这些部分几乎从不与异常相关。

标签: java android nullpointerexception


【解决方案1】:

你的问题是这一行

SharedPreferences sp = getSharedPreferences(prefName, MODE_PRIVATE);

getSharedPreferences() 使用Context,所以在onCreate() 运行之前你不能调用它。尝试像这样更改您的代码

public class MainActivity extends Activity {

Set<String> tasks = new HashSet<String>();
final String prefName = "andorid";
SharedPreferences sp;  // you can declare it here

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sp = getSharedPreferences(prefName, MODE_PRIVATE);  // but don't initialize it until at least here

    SetupApp();
}

就以阅读 logcat 为例

05-18 18:29:44.160: ERROR/AndroidRuntime(2145): FATAL EXCEPTION: main
05-18 18:29:44.160: ERROR/AndroidRuntime(2145): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.paad.whereami/com.paad.whereami.WhereAmI}: java.lang.NullPointerException
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.os.Looper.loop(Looper.java:130)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread.main(ActivityThread.java:3683)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at java.lang.reflect.Method.invokeNative(Native Method)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at java.lang.reflect.Method.invoke(Method.java:507)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at dalvik.system.NativeStart.main(Native Method)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145): Caused by: java.lang.NullPointerException
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at com.example.project.MainActivity.onCreate(MainActivity.java:216)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-18 18:29:44.160: ERROR/AndroidRuntime(2145):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

看到FatalException 后,查找第一行,如Caused by

这会告诉您您的异常是什么。在此示例中,NullPointerException。然后查找引用您的项目的第一行。这里是at com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290)。这告诉我们异常发生在MainActivity 的第 290 行,这是最好的起点。您可能必须从这里追溯它,但这通常是您的问题所在。

我从另一个问题中获取了这个堆栈跟踪,希望没有人介意,但这应该让您大致了解如何调试您的应用程序。您可能仍然不明白它发生的确切原因或位置,但这将更好地为您提出问题做好准备,以便您可以发布最相关的代码并试一试。希望这有帮助

【讨论】:

    【解决方案2】:

    使用eclipse调试android最好的方法是使用断点,捕捉异常,使用日志猫。

    像你一直在做的那样设置断点来尝试定位错误。

    如果断点不起作用,那么您可以查看日志 cat,它可能会为您提供更多信息,例如代码中发生错误的行。

    然后你可以尝试捕获异常:

    try{
      //do some stuff
    }catch(Exception e){
      Log.wtf("A terrible error occured.", e);
    }
    

    你也可以查看How to Debug Android application line by line using Eclipse?这个帖子,它告诉你更多的调试方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2011-02-22
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多