Я хочу проверить отчет о сбоях, используя acra
, но первым шагом я должен смоделировать фатальный сбой в Android с помощью кода.
Любая идея?
Я хочу проверить отчет о сбоях, используя acra
, но первым шагом я должен смоделировать фатальный сбой в Android с помощью кода.
Любая идея?
Just execute this code: divide by zero
Обновление: также можно попробовать Создайте метод,
public void stackOverflow() {
this.stackOverflow();
}
И назовите это где-нибудь/buttonClick
ИЛИ просто бросить неперехваченное исключение
throw new RuntimeException("This is a crash");
Бинго!
Кстати, этот IS глупый вопрос.
Не объявляйте активность в манифесте Android.
Вы можете попробовать исключение Null Pointer.
Integer i = null;
Затем вызовите любой метод объекта.
i.byteValue();
Вызов метода для объекта, который не был инициализирован, приведет к краху приложения.
Очень простой подход... и очень важно понять, почему это произошло.
Попробуйте инициировать переменную в onCreate()
до метода setContentView()
, затем используйте ее для вызова метода или переменной или попробуйте зарегистрировать ее в каком-то прослушивателе.
Например:
Button b;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b = (Button)findViewById(R.id.butt);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
}
});
setContentView(R.layout.main);
}
Это сбой, потому что до setContentView()
ни один из компонентов/вида в макете main.xml не получил идентификаторы.
Просто создайте в своем main.xml кнопку, подобную этой:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="crash"
android:text="Crash me" />
затем запустите приложение и нажмите для сбоя
Проще всего знаю: throw null.
Вы не можете выбросить нуль, поэтому возникает исключение NullPointerException.
throw null;
Вы можете потерпеть крах с простым исключением нулевой точки.
throw new NullPointerException();
в дополнение к ответу @vinnet-shukla:
"ИЛИ просто бросить необъяснимое исключение"
выбрасывать неперехваченное исключение для сбоя - плохая идея, поскольку исключение может быть захвачено где-то выше в стеке - особенно когда вы не знаете, где мы сейчас находимся :)
более элегантный способ - использовать ERROR
Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться обнаружить. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является "нормальным" условием, также является подклассом Error, поскольку большинство приложений не должны пытаться ее перехватить.
чтобы мы могли создать собственный подкласс Error и использовать его:
/*
* usage:
*
* CrashError.doCrash();
*
*/
public class CrashError extends Error {
public CrashError() {
this("simulated crash");
}
public CrashError(String msg) {
super(msg);
}
public static void doCrash() {
throw new CrashError();
}
}
но если мы говорим о других возможностях, мы могли бы также бросить проверенное исключение :)
это также будет уроком, как мы могли бы ПЕРЕСМОТРЕТЬ ПРОВЕРЕННОЕ ИСКЛЮЧЕНИЕ :) другим способом, кроме использования sun.misc.Unsafe, особенно когда класс недоступен в реализации VM
@SuppressWarnings("unchecked")
public static <E extends Throwable> void throwAnyT(Throwable e) throws E {
throw (E) e;
}
public static void throwUnchecked(Throwable e) {
throwAny(e);
// should never get there.
throw new InternalError();
}
public static void crash() {
throwUnchecked(new java.io.IOException("simulated crash"));
}
в дополнение к @audric ответу:
"Вы не можете бросить ноль"
да, вы можете :) это именно то, что вы делаете в своем примере, и да, это может стать необнаружимым, если блок catch не будет использовать Throwable - NPX никогда не будет выброшен, и просто будет нормальный поток, когда код все еще будет выполняться, и да, я Увидел это и испытал на себе :) на АНДРОИД ДАЛЬВИК
и что насчет..? Может быть, это может удовлетворить ваши потребности?
специфичные для Java (также в Android):
- Runtime.getRuntime().exit(int);
- System.exit(int);
- Runtime.getRuntime().halt(int);
специфичный для Android:
- android.os.Process.killProcess(int);
- android.os.Process.killProcessQuiet(int);
- android.os.Process.sendSignal(int,int);
- android.system.Os.kill(int);
Используйте следующий код:
String xyz=null;
system.out.println(xyz);