Как отлаживать Android / Java в Eclipse

1

Когда я комментирую calc1.setOnClickListener(buttonListener);, это нормально работает, когда я разрешаю ему запускать, он разбивает мой script. Как я могу понять, что происходит? 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
  • 0
    «Logcat показывает кучу красного, но я не уверен, как его читать ...» опубликуйте трассировку стека здесь, и мы можем помочь вам прочитать ее.
  • 0
    Зачем тебе это -1? Эпический провал
Теги:
debugging

3 ответа

1
Лучший ответ

Одно дело, что вы вызываете 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);
    }

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

  • 0
    Ах .... очень полезный совет ... спасибо!
  • 2
    @ccheneson, а как определить местонахождение ошибки по этой трассировке стека? Если я делаю XML-макеты, трассировки стека кажутся мне бесполезными.
Показать ещё 1 комментарий
3

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

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

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

2

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

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

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

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

  • 0
    Дело в том, что я ничего не записываю. Это проблема? Я предполагаю, что просто предположил, что это вызовет ошибку разбора или что-то более простое, как в PHP, но это определенно не так.
  • 0
    Ваш код предварительно скомпилирован, в отличие от PHP, который интерпретируется, поэтому, если вы довели его до такой степени, что он запускается, то нет проблем с анализом кода. Выдает исключение, которое будет отображаться как трассировка стека в LogCat. Вам просто нужно время, чтобы прочитать эту трассировку стека, и она должна сообщить вам точный номер строки, которая вызывает проблему.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню