什么是调试机器人code在Eclipse的最好方法是什么? [英] What is the best way to debug the android code in Eclipse?

查看:153
本文介绍了什么是调试机器人code在Eclipse的最好方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚开始我的手在Eclipse上,想知道是什么原因的错误在我的应用程序。我不知道他们是像Visual Studio的方式。

我的意思是我已经得到了空指针异常,但即使把断点我很困惑什么原因的错误发生。

由于我是新的大多数时间我跑坏或code这是行不通的。如何我承认我的错误。有时我的code没有工作,没有例外,很难找出与我的code真正的问题发生。

请专人检查code和指导我如何找到它。我是指怎么知道那里的空指针异常发生。

 公共类MainActivity延伸活动{

    设置<字符串>任务=新的HashSet<字符串>();
    最后弦乐prefName =Andorid的;
    共享preferences SP = getShared preferences(prefName,MODE_PRIVATE);

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        SetupApp();
    }

    // /添加任务在这个函数
    私人无效SetupApp(){

        tasks.add(嗒嗒);

        如果(!sp.contains(任务)){
            编辑器编辑= sp.edit();

            edit.putStringSet(任务,任务);

            edit.commit();
        }

    }

    公共无效btnClick(查看视图){

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

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

    }

    方法public void updateUI(字符串TASKNAME){

        最终的ListView列表视图=(ListView控件)findViewById(R.id.listView1);

        设置<字符串>任务= sp.getStringSet(任务,新的HashSet<字符串>());

        @燮pressWarnings(未登记)
        ArrayList的<字符串> taskarr =(ArrayList的<字符串>)任务;

        最后的ArrayList<字符串>名单=新的ArrayList<字符串>();
        的for(int i = 0; I< taskarr.size(); ++ I){
            list.add(taskarr.get(ⅰ));
        }
    }

    公共无效LoadTasks(){

    }

}

类StableArrayAdapter扩展ArrayAdapter<字符串> {

    HashMap的<字符串,整数> mIdMap =新的HashMap<字符串,整数>();

    公共StableArrayAdapter(上下文的背景下,INT textViewResourceId,
            名单<字符串>对象){
        超(背景下,textViewResourceId,对象);
        的for(int i = 0; I< objects.size(); ++ I){
            mIdMap.put(objects.get(ⅰ),ⅰ);
        }
    }

    @覆盖
    众长getItemId(INT位置){
        字符串项=的getItem(位置);
        返回mIdMap.get(项目);
    }

    @覆盖
    公共布尔hasStableIds(){
        返回true;
    }

}
 

解决方案

在这里你的问题是这样的行

 共享preferences SP = getShared preferences(prefName,MODE_PRIVATE);
 

getShared preferences()使用上下文所以你不能说这一点,直到的onCreate()已运行。试着改变你的code这样

 公共类MainActivity延伸活动{

设置<字符串>任务=新的HashSet<字符串>();
最后弦乐prefName =Andorid的;
共享preferences SP; //你可以在这里声明

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    SP = getShared preferences(prefName,MODE_PRIVATE); //但不初始化它,直到至少在这里

    SetupApp();
}
 

至于阅读的logcat拿这个例子

  05-18 18:29:44.160:ERROR / AndroidRuntime(2145):致命异常:主要
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.paad.whereami / com.paad.whereami.WhereAmI}:显示java.lang.NullPointerException
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.os.Handler.dispatchMessage(Handler.java:99)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.os.Looper.loop(Looper.java:130)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread.main(ActivityThread.java:3683)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在java.lang.reflect.Method.invokeNative(本机方法)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在java.lang.reflect.Method.invoke(Method.java:507)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在dalvik.system.NativeStart.main(本机方法)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):由:显示java.lang.NullPointerException
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在com.example.project.MainActivity.onCreate(MainActivity.java:216)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-18 18:29:44.160:ERROR / AndroidRuntime(2145):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
 

在看到 FatalException 查找第一行像

引起

这会告诉你你的异常是什么。在这个例子中, NullPointerException异常。然后查找引用您的项目中的第一道防线。这是在com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290)。这就告诉我们,除了在 MainActivity 290线发生的,这是最好的地方开始。您可能需要跟踪它从这里回来,但,这是一般,你的问题。

我抓住这个堆栈跟踪从另一个问题,希望没有人心中,但这应该给你如何调试你的应用程序的总体思路。你仍然可能不明白究竟为什么,或在那里发生的,但这样会更好prepare你问一个问题,所以你可以发布最相关的code,并给它一个很好的路要走。希望这有助于

I just start my hands on Eclipse and want to know what cause error in my apps. I wonder if their is a way like Visual Studio.

What I means is I have got Null pointer Exception but even after putting Breakpoint i am confused what cause error happen.

Because I am new most of time I run bad or code which will not work. How I recognize my mistake. Sometime my code is not working and exception are hard to figure out the real issue happen with my code.

Do someone check the code and guide me how to find it. I means how to know where the null pointer exception happen.

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

}

解决方案

Your problem here is this line

SharedPreferences sp = getSharedPreferences(prefName, MODE_PRIVATE);

getSharedPreferences() uses a Context so you can't call this until onCreate() has run. Try changing your code like this

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

As far as reading logcat take this example

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)

After you see FatalException look for the first line like Caused by

This tells you what your exception is. In this example, NullPointerException. Then look for the first line that references your project. Here it is at com.example.project.MainActivity.updateWithNewLocation(MainActivity.java:290). This tells us that the exception occurred at line 290 of MainActivity and this is the best place to start. You may have to trace it back from here but this is generally where your problem is.

I grabbed this stacktrace from another question, hope no one minds, but this should give you a general idea of how to debug your app. You still may not understand exactly why or where it happened but this will better prepare you to ask a question so you can post the most relevant code and give it a good go. Hope this helped

这篇关于什么是调试机器人code在Eclipse的最好方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆