2012-01-17 4 views
4

Аналогичный вопрос задавали здесь два раза и никогда не было ответа. Или ответ был: «Это невозможно!» Извините, возможно слишком много:Оказалось, что Throwable или Exception является нулевым

try{ 
    ... 
    // the line that causes the error 
    LinearLayout cell = (LinearLayout) inflater.inflate(R.layout.channels_list_cell, column); 
    ... 
} 
catch(Throwable e){ 
    Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show(); < breakpoint here! 
} 

В точке останова e равно null. Как я могу найти ошибку, пожалуйста? Возможно, это не проблема Java или Android, а отладчика Eclipse, который сам по себе требует отладки. Но что мне делать, кроме изменения в другую среду IDE? Есть идеи? Заранее благодарен.

Я пробовал Throwable, Exception, RuntimeException. Результат тот же.

Попытка перешагнуть через точку останова вызывает NullPointerException, поэтому e кажется действительно нулевым в тот момент. Где он может быть потерян?

Редактировать: Я приношу свою благодарность всем и +1 каждому ответчику. Это была ошибка Eclipse. После перезапуска Eclipse Exception больше не имеет значения null, это обычное RuntimeException: двоичная строка XML-файла # 15: вы должны указать атрибут layout_width. Это будет другая проблема, которая будет решена, но эта проблема решена.

+2

Почему вы ловите Throwable вместо Exception? – Rich

+0

Я пробовал Throwable, Exception, RuntimeException. Результат тот же. – Gangnus

+2

Я никогда не использую отладчик самостоятельно, но из того, что я видел, когда другие люди его используют, то, что он показывает для данного объекта, похоже, является результатом вызова 'String.valueOf (...)' на этом объекте. Поэтому, если метод 'toString()' пойманного исключения исключает либо «null», либо «null», тогда отладчик может дать ложное впечатление, что исключенное исключение - «null». – ruakh

ответ

1

Android не всегда выдает исключение в Throwable. Он фактически управляет всеми исключениями из catLog. Там вы найдете подробную информацию о своих исключениях, даже если в блоке catch ваш исключение: null.

Вы можете легко получить доступ к консоли catlog от затмения и фильтра, чтобы просмотреть ошибки только

UPDATE:

Ваша точка останова должна быть внутри блока поймать

+0

logcat его не улавливает. (отфильтровывается, журнал очищается непосредственно перед линией, вызывающей ошибку) – Gangnus

+0

@Gangnus, где вы положили точку останова? –

+0

Есть много из них перед строкой, которая вызывает исключение. Я шаг за шагом. И у меня должен быть разрыв в тосте - или там будет некоторая ошибка nullPointer. – Gangnus

2

Если исключение вы пойманы было исключение NullPointerException, метод getMessage() возвращает «null», что может сбивать с толку. Я знаю, что это иногда путало меня!

В отладчике вы можете выбрать e и увидеть тип и его поля. Кроме того, еще один способ отладки, когда все запуталось это пойти

e.printStackTrace(); 

(примечание - я не гуру Android, так что если это работает по-другому на Android кто-то пожалуйста, комментарий!)

+2

Чувак, он сказал, что 'e' равно null. Как вы можете получить доступ к методу 'printStackTrace()', если объект имеет значение null? –

+0

Это интересная мысль. Но ... Когда я вижу «проверять» что-то, я не вижу его результат «toString», а всю структуру экземпляра со значениями. И здесь я вижу голый нуль, как видно на несозданных объектах. Возможно, Eclipse делает такую ​​ошибку здесь, что она работает, как вы говорите, я проверю завтра. – Gangnus

+0

@ Adel Boutros. Он считает, что объект не является действительно нулевым, он только показывает себя как null из-за некоторой ошибки в отладчике. Он оставил это предложение как имплицитный. И это очень вероятно. Что касается конкретных попыток раскрыть скрытый внутри e, извините, я не работаю и могу продолжать только завтра. – Gangnus

2

Подтвердили ли вы e на самом деле пустая или нет? То есть добавив что-то вроде if (e == null) Log.d("Exception is null"). Затем я проверял, запускается ли оператор журнала как во время обычного выполнения, так и во время отладки. Если результаты отличаются друг от друга, это указывает на ошибку VM (маловероятно, но возможно). Если сообщение не запускается в любом случае, это, скорее всего, проблема с отладчиком.

Несколько мыслей по поводу дальнейших вещей, которые вы можете попробовать отладить вопрос:

  • попробовать что-то вроде JDB и посмотреть, если вы получите такое же поведение

  • Вы можете получить дамп JDWP связь между отладчиком и устройством и посмотреть, что происходит на этом уровне.Возможно, используйте wirehark или tcpdump и захватите данные, идущие через шину usb к устройству.

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

  • Вы могли бы попытаться сделать какие-то сценарного JDWP сессии с устройством

  • Вы можете посмотреть на байткод (baksmali/dexdump/Dedexer), чтобы увидеть, если что-то выглядит смешно

+0

спасибо. Это забавно, я боролся с тем, чтобы утвердить и гораздо более простой способ (если ... затем) ускользнул от моего внимания. Когда я вернусь на работу, я сделаю это немедленно. Что касается jd и jdwp, wirehark и tcpdump, AOSP, извините, я читаю о них в первый раз. Что касается байт-кода, я могу прочитать его, но я не знаю, где его искать для java и того, что там написано и как оно написано. Извините, уровень этих советов слишком высок, чтобы быть полезным для меня. – Gangnus

+0

Правильно, большинство моих советов потребуют хорошего рабочего знания платформы Android. Что касается последнего момента, в частности, вы можете запустить baksmali на apk, чтобы получить байт-код dalvik. – JesusFreke

+0

Действительно, я не понимаю необходимости столь глубокого изучения технологии, которая настолько ошибочна, что решение в 99% вариантов состоит в том, чтобы перезагрузить или перезагрузить что-то или изменить мягкое использование (для наличия ** других ** ошибок). Это было полезно 20 или 40 лет назад, когда описания соответствовали SW. – Gangnus

1

Я знаю, что этот вопрос был опубликован некоторое время назад, и много раз! Вчера я попал в эту ловушку, и я подумал, что опубликую то, что нашел.

Определение проблемы: Я использовал следующий код

public class myAppActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     try { -- lots of code -- } 
     catch (Exception ex) { 
      Log.e ("eTutorPrism Error", "Caught this exception " + ex); 
      ex.printStackTrace(); 
     } 
    } 
} 

Symptom was that 'ex' was always null and resume will give NullPointerException, although the actual exception was an IllegalArgumentException in a call made into another class from the code above. 

ВОПРОС: OnCreate() код не отображается исключения пойманного. вместо этого он показывает exception = null.

Решение: НЕ используйте слишком много обработки в onCreate(). Переместите как можно больше в другой поток. Поэтому я изменил код, чтобы выглядеть следующим образом. вуаля, это работает !!! Я вижу фактическое исключение, отображаемое в Logcat.

public class eTutorPrismAppActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     eTutorPrismTest myTest = new eTutorPrismTest (getApplicationContext()); 
     myTest.start(); 
    } 
} 

class eTutorPrismTest extends Thread 
{ 
    private Context m_AppContext = null; 

    public eTutorPrismTest (Context appContext) 
    { 
     m_AppContext = appContext; 
    } 

    public void run() 
    { 
     -- lots of code that needs appContext -- 
    } 
} 
1

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

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

SpecificException assignedVar = null; 
try { 
    ... 
} 
catch (SpecificException exc) { 
    assignedVar = exc; // <-- exc comes up null in the debugger, but assignedVar will be the correct object. 
} 

Надеюсь, что это работает для других в качестве обходного пути.

Смежные вопросы