47

我想测试崩溃报告,acra但第一步是我需要使用代码模拟 Android 中的致命崩溃。

任何想法?

4

14 回答 14

102
Just execute this code: divide by zero

更新:也可以试试这个创建方法,

public void stackOverflow() {
        this.stackOverflow();

    }

并在某处调用它/按钮单击

或者简单地抛出一个未捕获的异常

throw new RuntimeException("This is a crash");

答对了!

于 2012-08-04T09:11:25.447 回答
29
  1. 访问未定义的视图。
  2. 无需检查即可访问空列表的第一个元素。
  3. 除以零。
  4. 将设备扔出窗外。
  5. 将设备浸入水中。
于 2012-08-04T09:15:50.993 回答
13

不要在 Android Manifest 中声明活动。

于 2012-08-04T09:12:26.257 回答
10

您可以尝试空指针异常。

Integer i = null;

然后调用对象上的任何方法。

i.byteValue();

在尚未初始化的对象上调用方法将使应用程序崩溃。

于 2012-08-04T09:16:49.527 回答
6

只需在 main.xml 中创建一个按钮,如下所示:

 <Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="crash"
    android:text="Crash me" />

然后运行您的应用程序并单击崩溃

于 2015-01-23T16:04:14.673 回答
6

一个非常简单的方法......并且理解它为什么会发生非常重要。

尝试在方法之前初始化一个变量,然后使用它来调用方法或变量或尝试将其注册到某个侦听器。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 布局中的所有组件/视图都没有得到它们的 id 之前。

于 2012-08-04T09:22:34.607 回答
2

我知道的最简单的:抛出null。

您不能抛出 null,因此会引发 NullPointerException。

throw null;
于 2014-04-24T15:55:26.390 回答
1

除了@vinnet-shukla 答案:

“或者只是抛出一个未捕获的异常”

抛出未捕获的异常来导致崩溃是个坏主意,因为异常可能会被堆栈中更高的位置捕获 - 特别是当他不知道我们现在在哪里时:)

更优雅的方法是使用 ERROR

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 永远不会被抛出,并且当代码仍将执行时会有正常流程,是的,我'll已经看到了这一点,我自己经历了:)在android dalvik上

那么..呢?也许它可以满足您的需求?

java特定的(也在android中):

- Runtime.getRuntime().exit(int);
- System.exit(int);
- Runtime.getRuntime().halt(int);

安卓具体:

- android.os.Process.killProcess(int);
- android.os.Process.killProcessQuiet(int);
- android.os.Process.sendSignal(int,int);
- android.system.Os.kill(int);
于 2019-05-19T10:38:43.163 回答
1

您可能会因简单的空点异常而崩溃。

 throw new NullPointerException();
于 2019-03-25T11:15:11.513 回答
0

对于科特林:

val test = ("0")
println(test[1])
于 2021-01-10T08:47:19.260 回答
0

如果您使用的是 firebase crashlytics,那么有一种非常简单的方法可以做到这一点。在他们的文件中也提到过。

val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.log("my message")
于 2020-11-10T10:48:29.550 回答
0

您可以使用这行代码简单地使应用程序崩溃。

throw new RuntimeException("Test Crash"); // Force a crash

您可以传递消息,在本例中为“Test Crash”,以后可以参考。

领先一步, 确保您的应用程序的所有类文件都没有实现 UncaughtExceptionHandler 接口,如下所示,

public class MyApplication extends Application implements Thread.UncaughtExceptionHandler{

否则,上述异常或任何与此相关的异常将被该类捕获/使用,从而不会导致应用程序崩溃。但是,您可以在下面的 uncaughtException(Thread t, Throwable e) 方法中获取该异常并采取所需的操作。在您的情况下,您将使用他们支持的 SDK 方法将其报告给 Acra。

@Override
public void uncaughtException(Thread t, Throwable e) {
    Log.e("MyApplication", "Error", e);
}
于 2021-05-05T11:17:20.080 回答
0

像这样延迟一段时间后强制崩溃,

new android.os.Handler().postDelayed(
              new Runnable() {
                  public void run() {
                      Log.i("tag", "This'll run 10 seconds later");
                      throw new RuntimeException("This is a crash");
                  }
              },
              10000);

参考 1参考 2

于 2020-10-22T13:39:01.423 回答
-3

使用以下代码:

String xyz=null;
system.out.println(xyz);
于 2015-01-06T11:44:12.423 回答