Ответ 1
Вы можете сначала проверить, включен ли этот параметр в Eclipse.
Окно → Настройки → Java → Отладка → Приостановить выполнение неперехваченных исключений
Если этот параметр включен, любое неперехваченное исключение приостанавливает JVM точно в точке его броска, включая классы, вызываемые с помощью отражения. Это без добавления точки останова, но при условии необработанной, т.е. Ваш код даже не вызывается внешним кодом из try-catch.
Например,
int a = 0, b= 0;
System.out.println(a/b); // ArithmeticException
Даже если этот код вызывается из кода, вызванного отражением, eclipse будет приостанавливаться в sysout со всеми переменными, все еще доступными в стеке.
Однако в стартовом классе Android ZygoteInit
есть следующая строка:
catch (Throwable t) {
Log.e(TAG, "Error preloading " + line + ".", t);
if (t instanceof Error) {
throw (Error) t;
}
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
throw new RuntimeException(t);
}
Причина, по которой такой код нарушает отладку Eclipse, - это RuntimeException
теперь не более необработанный. Ваш UncaughtExceptionHandler
может фактически поймать класс запуска вместо вашего пользовательского кода. Это для обычного Eclipse.
Решение 1:
- Перейти к запуску → Добавить точку исключения исключений Java →
Throwable
- Нажмите
Throwable
в представлении точки останова - Щелкните правой кнопкой мыши → Свойства точки останова → Добавить пакет → OK
- Отметьте опцию Подклассы этого исключения
Примечание. Это может незначительно уловить java.lang.OutOfMemoryError
, но определенно не может поймать java.lang.StackOverflowError
.
Решение 2: (Только если слишком много обнаруженных исключений, НЕ рекомендуемых в противном случае)
- Скопируйте исходный код
com.android.internal.os.ZygoteInit
в новый проект:MyBootstrap
-
Измените блок
catch (Throwable t)
, чтобы поймать толькоError
} catch (Error t) { Log.e(TAG, "Error preloading " + line + ".", t); throw t; }
-
Настройки отладки → Путь к классам → Нажмите "Загрузки Bootstrap" → Добавить проекты →
MyBootstrap
. Переместите этот проект в начало