美文网首页
Java错误和异常

Java错误和异常

作者: Joe_blake | 来源:发表于2018-06-09 17:04 被阅读11次

    一、顶级异常类-----Throwable

    Throwable继承自Object类,实现了Serializable接口,可以进行序列化。常用的子类有Exception和Error

    1.序列化的作用

    在Throwable类中使用输出流来进行输出,并把其对象作为输出流对象,这就需要必须实现序列化接口,使得其可以进行序列化,才能作为输出流中的对象进行输出。

    2.Exception和Error
    • Exception指Java程序设计中,可以预料到在运行时可能发生并且应该被捕获的错误,需要相应的处理;
    • Error主要是用于表示Java和虚拟机内部的异常信息,其不便于捕获,也难以处理;

    一、Throwable的两大子类------Exception和Error

    1. Exception和Error的设计与分类

    image
    Exception类分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception)。
    • RE能通过编译,但会在运行时抛出,如果未进行处理会导致程序崩溃。RE是完全可以在编程中避免的,因而是不受编译器检查的(unchecked,也包括Error),例如:NullPointerException、ArrayIndexOutOfBoundsException等;
    • CE是指不能通过编译器检测的异常情况,这总异常通常难以避免,必须try...catch...进行处理,例如:FileNotFoundException。
    question:ClassNotFoundException和 NoClassDefFoundError的区别?
    • NoClassDefFoundError 是程序在编译时候可以找到其依赖的类,但是在运行时找不到或者可以找到多个相同的依赖类,此时抛出NoClassDefFoundError
    • ClassNotFoundException通常是在类路径错误,或者类名称发生更改时抛出,编译器无法通过路径加载该类,即无法通过编译。

    2. 如何处理好Exception

    • 不要捕获Exception这样的通用异常,而应捕获特定的异常,并对其作出相应的处理。

    例示:

    //no
        try {
        .....
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    //yes
        try {
        .....
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            Log.(TAG,"线程中断/阻塞,需要清理");
        }
    
    • 尽早的抛出异常,以便分析堆栈日志,或者详细地输出到Log中,以便分析。
        private void read(String filename) {
            Objects.requireNonNull(filename);
            try {
                InputStream in = new FileInputStream(filename);
            } catch (FileNotFoundException e) {
                Log.(TAG,"文件路径错误");
            }
        }
    

    3. 如何自定义异常

    • 所有异常都必须是 Throwable 的子类。
    • 自定义检查性异常类,继承 Exception 类。
    • 自定义运行时异常类,继承 RuntimeException 类。

    4. 注意事项

    1. try-catch会产生额外的性能开销,影响JVM对代码进行优化。所以只需try住必要的代码段,而不是整个一大段代码。
    2. 不要用try-catch的形式控制代码流程(逻辑),远比switch-case、if-else要低效。
    3. Java在实例化Exception时,都会对当时的栈进行快照,当频繁进行该操作时,会影响到性能。
    4. 尽可能的就地处理异常,而不是向上抛出/只捕获不处理。
    5. 不要在finally中处理返回值,会覆盖掉try代码块里面的return。
    • 当try和catch中有return时,finally仍然会执行;

    • finally中包含return,不会对try块中要返回的值进行保护

        public static int test() {
            int i=0;
            try {
                i = 1;
                return i;
            } finally {
                i = 2;
                return i;
            }
        }
        
        //返回 2 
    

    相关文章

      网友评论

          本文标题:Java错误和异常

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