美文网首页Java基础
Java基础之异常体系

Java基础之异常体系

作者: sofarsogoo_932d | 来源:发表于2018-06-23 14:10 被阅读11次

    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 这几个展开的

    • 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

    相关文章

      网友评论

        本文标题:Java基础之异常体系

        本文链接:https://www.haomeiwen.com/subject/xtgesftx.html