нулевой указатель на вопрос новичка Android на ArrayAdapter.setAdapter - PullRequest
2 голосов
/ 26 июня 2010

Я медленно учусь и создаю свое первое приложение для Android. Я ОЧЕНЬ новичок в Java, но уже выполнил пару проектов на C #, VB.NET (в прошлом), Objective-C (в магазине 6 приложений) и Fortran (waaaaaaaaaaaaaaaaaaaay назад в тот день;)

Итак, я только что получил из-за рубежа легенду htc (я не в США), которую я купил, чтобы иметь приличное устройство среднего уровня для разработки (на нем работает некорневый adnroid 2.1)

Приложение, которое я разрабатывал, имеет целевой уровень 4 (Android 1.6). Он использует базу данных sqlite3 объемом 5 Мб с расширением .mp3, чтобы избежать сжатия внутри apk и правильного копирования из ресурсов в системную папку.

На эмуляторе все работает нормально, и на устройстве я вижу, что размер файла приложения после копирования базы данных точно соответствует тому, что я вижу на эмуляторе.

Теперь, в моей основной деятельности с просмотром списка и вращением, я связываю некоторые данные через два адаптера массива. при работе на устройстве все делает плавно. но при попытке запустить на устройстве эту часть кода:

public class mainAct extends Activity implements OnItemSelectedListener, TextWatcher, OnItemClickListener
{   
        /** members */
        //private EditText searchtext;
        private ListView designations;
        private ArrayAdapter<String> adapterShapes;
        private ArrayAdapter<String> adapterTypes;
        private Spinner types;
      .  
      .  
      .    
    public void onCreate(Bundle savedInstanceState)   
    {  
      .  
      .  
      .    
        // DESIGNATIONS  
        // 
        adapterShapes = new ArrayAdapter<String>(this,R.layout.list_item,shapes);       // custom TextView Adapter  
        designations=(ListView)findViewById(R.id.designations);
        Log.e("MAIN.ACCT", "ok to 172");
        designations.setAdapter(adapterShapes);
        Log.e("MAIN.ACCT", "ok to 174");
        designations.setOnItemClickListener(this);

        // TYPES
        //
        adapterTypes=new ArrayAdapter<String>(this,R.layout.spinner_item,DT.get().typesInLibrary);
        types=(Spinner)findViewById(R.id.types);
        types.setAdapter(adapterTypes);
        types.setOnItemSelectedListener(this);
      .  
      .  
      .  
    }
}

Оба обозначения .setAdapter (adapterShapes);
& types.setAdapter (adapterTypes);

дай мне исключение Null Pointer.

Я использую Eclipse под Mac, окно LogCat выдает:

06-25 18: 41: 37.842: ОШИБКА / AndroidRuntime (9523): Uncaught обработчик: основной выход потока из-за необученное исключение

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): java.lang.RuntimeException: невозможно начать деятельность ComponentInfo {com.davidhomes.steel / com.davidhomes.steel.mainAct}: java.lang.NullPointerException

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2596)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в

android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2621)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в android.app.ActivityThread.access $ 2200 (ActivityThread.java:126)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1932)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в android.os.Handler.dispatchMessage (Handler.java:99)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в android.os.Looper.loop (Looper.java:123)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в android.app.ActivityThread.main (ActivityThread.java:4595)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в java.lang.reflect.Method.invokeNative (Native Метод)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в java.lang.reflect.Method.invoke (Method.java:521)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:860)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

06-25 18: 41: 37,891: ОШИБКА / AndroidRuntime (9523): в dalvik.system.NativeStart.main (Native Метод)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): вызвано: java.lang.NullPointerException


-------------------------------------------------- ------------ 06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в com.davidhomes.steel.mainAct.onCreate (mainAct.java:183)

----------------------------------------------- ---------------

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): вandroid.app.ActivityThread.performLaunchActivity (ActivityThread.java:2544)

06-25 18: 41: 37.891: ОШИБКА / AndroidRuntime (9523): ... 11 более

06-25 18: 46: 38.252: ОШИБКА / ActivityManager (99): не удается установить топ приложение изменено!

Строка 183 - это первый вызов setAdapter (designations.setAdapter (adapterShapes);), когда я его закомментирую, второй setAdapter - это один код, нарушающий код

Я немного растерялся, адаптеры показывают правильное количество элементов в окне журнала при запуске с симулятора и устройства.

Я признаюсь, что являюсь нубом как для Java, так и для Android, поэтому любая помощь очень ценится.

привет
Дэвид

Ответы [ 4 ]

4 голосов
/ 26 июня 2010

Ну, как вы, наверное, уже поняли, некоторая переменная равна нулю. К сожалению, в вашем коде нет очевидного источника исключения NullPointerException.

Поэтому сначала вы должны попытаться определить, какая переменная равна нулю, и, следовательно, вызвать исключение.

Например, findViewById возвращает ноль, если не удается найти представление, поэтому вы можете дважды проверить правильность инициализации ListView и Spinner.

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

Как только вы (и мы) точно знаете, где происходит исключение NullPointerException, вам будет легче дать более конкретный совет

3 голосов
/ 07 июля 2010

Oops! это была моя вина, так или иначе, у меня было ДВА макета (один для разных разрешений), у того, который использовался на моем устройстве, не было надлежащего ListView и Spinner ID. Этот альтернативный макет был свернут в папку, и я просто забыл об этом (я приостановил разработку приложения примерно на 2 месяца, пока не получил устройство для тестирования).

тот, который работал нормально, устанавливался на симуляторе, но не на устройстве, и наоборот, странно, поскольку хороший соответствует разрешению моего устройства (я почти уверен, что что-то там тоже отсутствует, но это не важно прямо сейчас)

Тем не менее, спасибо Крису за то, что он указал мне на возвращаемое значение Null в findViewById. Будучи новичком в Android, я заблудился, поскольку должен был начать

С наилучшими пожеланиями Дэвид

1 голос
/ 10 декабря 2013

У меня была такая же проблема. Я помещаю сообщения Log.d в распечатку каждого объекта. Оказалось, что мой объект ListView был "нулевым". Причиной этого было неправильное действие XML, указанное в моем SetContentView. Я думаю, что самый простой способ отладить эту проблему - продолжать помещать сообщения Log.d до тех пор, пока вы не найдете объект / переменную, которая является «нулевой».

1 голос
/ 30 апреля 2012

Я знаю, что это давно закрытая тема.Однако я только столкнулся с той же самой проблемой, и этот пост не ответил на него.

То, что я сделал, было очень глупо.Я забыл добавить ссылку на XML.то есть.setContentView (R.layout.settings);

на самом деле похоже, что оригинальное сообщение также могло забыть об этом, поэтому я подумал, что просто опубликую его.Приветствия.

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