2013-05-28 150 views
0

我剛開始使用Eclipse,希望知道在我的應用程序中導致錯誤的原因。我不知道他們是否像Visual Studio一樣。在Eclipse中調試android代碼的最佳方式是什麼?

我的意思是我得到了空指針異常,但即使把斷點後,我很困惑什麼原因錯誤發生。

因爲我是新來的大部分時間我運行不好或代碼不會工作。我如何認識到我的錯誤。有時我的代碼無法正常工作,異常很難發現我的代碼出現真正的問題。

有人檢查代碼並指導我如何找到它。我的意思是如何知道空指針異常發生在哪裏。這裏

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; 
    } 

} 
+0

爲什麼不看logcat輸出來查看NPE的位置?查看代碼並找出「NPE」的其他位置「它可能在這裏或這裏或這裏或...」 –

+0

發佈您的logcat,我們可以幫助您知道如何閱讀它找到錯誤 – codeMagic

+0

如果你問我,logcat是相當可怕的,但是除非你交換IDE,否則你必須使用它。當從logcat的複製確保這一切複製到一個文本文件作爲郵件的一半不顯示了很多的時間,然後再通過這一點,並找出其中的問題,也將其設置爲錯誤模式不詳細 –

回答

4

你的問題是此行

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(); 
} 

代碼至於看完之後你看到FatalException樣子像Caused by

這告訴你你的例外就是第一行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) 

。在這個例子中,NullPointerException。然後查找引用您的項目的第一行。這裏是at com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290)。這告訴我們例外發生在MainActivity的290行,這是最好的開始。你可能不得不從這裏追溯它,但這通常是你的問題所在。

我從另一個問題抓住了這個堆棧跟蹤,希望沒有人介意,但是這應該給你一個關於如何調試你的應用程序的一般想法。你仍然可能不知道究竟爲什麼發生了,但是這會讓你更好地準備問一個問題,這樣你就可以發佈最相關的代碼並給它一個好的去處。希望這有幫助

1

使用eclipse調試android的最好方法是使用斷點,捕獲異常並使用日誌貓。

設置斷點像你​​一直試圖找到錯誤。

如果斷點不起作用,那麼您可以查看日誌貓,它可能會提供更多信息,例如代碼中發生錯誤的行。

那麼你可以嘗試捕捉異常:

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

你也可以查看這個帖子How to Debug Android application line by line using Eclipse?它告訴你更多的調試方法。

相關問題