您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Shutting down VM不显示堆栈信息解决方案

时间:02-05来源:作者:点击数:

这个恶心的异常是个什么异常呢?我也不知道,最近把公司一个球机的app项目移植到手机上,经常崩掉,在控制台上能看到的错误只有一行:

AndroidRuntime: Shutting down VM

这能看出什么啊?没有详细的堆栈信息,根本没法知道是哪个类哪一行报出来的异常,只能从Application开始,一点一点的注释代码,通过这样的排除法来打到是哪里导致的异常,而且我每解决一个异常,另一个类有异常,也是这种,遇到了好多个地方不兼容的,都是报这个异常,找起来可真是痛苦啊!

比如下面的代码:

// 设置系统时间自动获取时区
Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME, 1);

这个设置需要系统应用才能设置的,所以普通的应用就崩了,崩就崩吧,提示一下为什么崩呀,直接来个Shutting down VM,这是真的很烦人,后来我创建了一个全新的项目,把这一行代码复制过去,也崩了,也会出现Shutting down VM,但是后面会有真实的异常信息,这就很神奇了,开始我以为是因为什么特殊的没见过的异常才导致没有异常信息,结果证明不是,于是我在那个只报Shutting down VM没有堆栈信息的项目里面手动的制作一个空指针异常,代码如下:

String str = null;
str.charAt(0);

也是只报Shutting down VM没有堆栈信息,这下彻底证明了是这个项目的问题导致没有异常堆栈信息的,但是为什么会这样呢我就不搞不懂了,这个项目在球机中运行有异常是会报出堆栈信息的,怎么在手机上跑就没有堆栈信息了呢,百度也找不到答案,如果这样开发肯定是不行的,开发过程中肯定会经常出异常,但是你看不到异常的堆栈信息,Bug解决起来就痛苦了。

如果是平时自己做练习,像这种问题肯定就不管了,工作就是工作,出现问题不管怎样还是要解决的,最后还是找到了原因,有点经验的都知道,项目都是要做异常保存的,一般会在Application中保存未捕捉的异常,代码如下:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
                Util.saveException(e);
            }
        });
    }
}

问题就出现在保存异常的方法里面,为什么在球机上运行没问题呢?因为在球机上我是把异常保存在外置Sdcard的,而保存在外置sdcard需要一个系统权限,在球机上我是有系统权限的,所以能正常保存,而跑在手机上,因为没有了系统权限,所以往外置sdcard存东西时就挂了异常,这个就是问题所在。

总结:当出现异常后,我们在处理未捕捉异常时又抛出一个异常,则在控制台就不会出现异常的堆栈信息。

后来又发现,在捕捉未处理异常的方法中什么都不写,也是只有Shutting down VM,见鬼了,我之前是怎么做那个实验的,我被自己给气着了。

可以在处理的时候输出Log,即手动调用Log.e(TAG, message, e)来打印异常信息。

结过多次测试,包括创建新项目,实验证明,只要设置了未捕捉异常,则系统不会再打印异常信息,而我之前项目没感觉到这个问题是因为我有打印。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门