我只是开始使用Eclipse,想知道我的应用程序中出现错误的原因。我想知道他们是否像Visual Studio一样。
我的意思是我有Null指针异常,但即使放入断点后我也很困惑,导致错误发生的原因。
因为我是新手大部分时间我运行不好或代码不起作用。我多么认清自己的错误。有时候我的代码不起作用,而且我的代码很难弄清楚真正的问题。
有人检查代码并指导我如何找到它。我的意思是如何知道空指针异常发生的位置。
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 :(得分: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();
}
至于阅读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行,这是最好的起点。您可能需要从此处追溯,但这通常是您的问题所在。
我从另一个问题中抓住了这个堆栈跟踪,希望没有人介意,但这应该会让你大致了解如何调试你的应用程序。您仍然可能无法确切地理解为什么或发生了什么,但这样可以更好地准备您提出问题,以便您可以发布最相关的代码并给它一个好的方法。希望这有帮助
答案 1 :(得分:1)
使用eclipse调试android的最佳方法是使用断点,捕获异常并使用log cat。
设置断点,就像你一直在尝试找到错误一样。
如果断点不起作用,那么您可以查看日志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?,它会告诉您更多调试方法。