Java基础

Java基础之异常体系

2018-06-23  本文已影响11人  sofarsogoo_932d

1. Java异常体系

Java异常体系.png

Throwable
Throwable是整个异常体系的顶层父类,它有两个子类,分别是Error和Exception

Error
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止

Exception
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常

Exception又分为RuntimeException(运行时异常)和受检查的异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常属于unchecked异常,开发人员可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

除了java.lang.RuntimeException 和 java.lang.Error 类及其子类是 unchecked exception,其余的就是 checked exception 了。受检查的异常的特点就是当你调用了抛出这些异常的方法后,必须要处理这些异常。如果不处理,程序就不能编译通过。如:IOException、SQLException、用户自定义的Exception异常等。

2. 如何处理异常

Java中的异常处理都是围绕着 try-catch-finally, throw, throws 这几个展开的

我们来通过一段代码来说明

public class Main {

    public static void main(String[] args) {
        int a = 5 / 0;
        System.out.println("Hello World!");
    }
}

运行结果

Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)

Process finished with exit code 1

可以看出抛出了一个异常,并且程序停止了

增加一个try-catch语句

public class Main {

    public static void main(String[] args) {

        try {
            int a = 5 / 0;
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
        System.out.println("Hello World!");
    }
}

执行结果

java.lang.ArithmeticException: / by zero
Hello World!
    at Main.main(Main.java:6)

Process finished with exit code 0

程序正常执行了,输出的异常信息是我们在catch快中输出的

下面我们将这两段代码放在安卓中

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    int a = 5 / 0;
}

结果是app直接崩溃


日志1.png

错误是Error级别的,并且是红色的比较明显

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        int a = 5 / 0;
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
}

结果是app正常运行


日志2.png

在error级别的日志中是看不到的,并且蓝色的,并没有红色那么明显

结论
通过try-catch语句,一定程序上减少了程序的崩溃率,但是这样也会带来一个弊端,就是隐藏了一些问题,因为这个问题,明显是程序逻辑的问题,应该更改程序逻辑,即判断除数不能为空
对于最常见的NPE问题,也是这样,判断对象是否为null,而不是盲目的去try-catch

3. Crash处理文章

美团外卖Android Crash治理之路
https://tech.meituan.com/waimai-android-crash.html

上一篇 下一篇

猜你喜欢

热点阅读