如何以编程方式崩溃Android应用程序?

时间:2012-08-04 09:10:18

标签: java android eclipse

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

有什么想法吗?

14 个答案:

答案 0 :(得分:54)

Just execute this code: divide by zero

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

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

    }

然后在某处调用/ buttonClick

或者只是抛出未捕获的异常

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

宾果!

答案 1 :(得分:19)

  1. 访问未定义的视图。
  2. 无需检查即可访问空列表的第一个元素。
  3. 除以零。
  4. 将设备扔出窗外。
  5. 将设备浸入水中。
  6. 顺便说一句 IS 是一个愚蠢的问题。

答案 2 :(得分:8)

  

不要在Android Manifest中声明活动。

答案 3 :(得分:7)

您可以尝试Null Pointer异常。

Integer i = null;

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

i.byteValue();

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

答案 4 :(得分:5)

一种非常简单的方法...... 非常重要,可以理解为什么会发生这种情况。

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。

答案 5 :(得分:4)

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

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

然后运行您的应用并点击崩溃

答案 6 :(得分:2)

我知道最简单:抛出null。

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

throw null;

答案 7 :(得分:0)

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

 throw new NullPointerException();

答案 8 :(得分:0)

除了@ 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以外的其他方式来进行RETHROW CHECKED EXCEPTION :),特别是当该类在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将永远不会被抛出,并且只会存在正常的流程,当代码仍将执行时,是的,我会亲身经历并亲自体验的:)在ANDROID DALVIK上

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

特定于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);

答案 9 :(得分: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);

Ref-1Ref-2

答案 10 :(得分:0)

如果您使用的是Firebase crashlytics,则有一种非常简单的方法来执行此操作。在他们的文档中也提到了。

val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.log("my message")

答案 11 :(得分:0)

对于科特林:

val test = ("0")
println(test[1])

答案 12 :(得分: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);
}

答案 13 :(得分:-3)

使用以下代码:

String xyz=null;
system.out.println(xyz);