Как отлаживать Android / Java в Eclipse - PullRequest
1 голос
/ 24 декабря 2010

Когда я закомментирую 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

Ответы [ 3 ]

3 голосов
/ 25 декабря 2010

ответ ccheneson , вероятно, правильный для вашего конкретного случая.

В соответствии с трассировкой стека, в которой вы работаете с исключением NullPointerException.Отличный способ облегчить их отслеживание - это добавить точку останова исключения Java для всех неперехваченных исключений NullPointerExceptions.(Я также предлагаю разбить ArrayIndexOutOfBoundsException, IllegalArgumentException и IllegalStateException).

Чтобы сделать это, перейдите в перспективу Debug (Window -> Open Perspective -> Debug или Other и затем Debug), найдите панель точек остановапо умолчанию объединяется с панелью переменных (справа вверху) и затем нажимает J!значок.В следующий раз, когда вы столкнетесь с этим исключением, вы сможете увидеть, где именно оно происходит, вместо того, чтобы просеивать выходные данные RuntimeException.

2 голосов
/ 24 декабря 2010

Кто-то, вероятно, знает, как это исправить, но я слишком нов, чтобы знать - хотя я могу помочь с отладкой.

Если вы хотите выполнить отладку через LogCat, я предлагаю создать фильтр. Вы можете сделать это, нажав зеленый + в представлении LogCat и введя правила, по которым вы хотите фильтровать. То, что я делаю, - это все мои операторы журнала под определенным флагом [Log.d (DEBUGTAG, message); ] поэтому я настроил свой фильтр так, чтобы он просто искал эти теги и больше ничего не отображал.

Если вы хотите выполнить отладку, шаг за шагом просматривая приложение, вы можете установить точку останова, дважды щелкнув полосу слева от номера строки, где вы хотите ее остановить - маленькая синяя точка должна объявиться. Затем, когда вы запустите программу с помощью кнопки «Отладка», она будет работать, пока не достигнет этой точки останова. Теперь вы можете использовать клавишу F6, чтобы перейти к следующей строке. F5 переведет в функцию. Кроме того, вы можете посмотреть текущие значения объектов.

Надеюсь, это поможет - как я уже сказал, я тоже новичок в этом. Много учусь по ходу дела.

1 голос
/ 25 декабря 2010

Во-первых, вы звоните 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);
    }

Поскольку вы пытаетесь найти представление по идентификатору без указания какого-либо макета ранее (с помощью setContentView(R.layout.main);), возвращаетсянулевой объект calc1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...