• 《java JDK7 学习笔记》之异常处理


    1、java中所有的错误都会被打包为对象,JVM会尝试执行try区块中的程序代码,如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的异常类型,是否符合被抛出的错误对象类型,如果是的话,就执行catch区块中的程序代码。

    2、错误对象都继承自java.lang.Throwable类,Throwable定义了取得错误信息、堆栈追踪等方法,它有两个子类:java.lang.Error与java.lang.Exception。

    3、Error与其子类实例代表严重系统错误,Error对象抛出时,基本上不用处理,任其传播至JVM为止,或者是最多留下日志信息。

    4、通常程序中会使用try、catch加以处理的错误,都是Exception或其子类实例,所以通常称错误处理为异常处理,对于某些异常,可以try、catch语法尝试捕捉将应用程序恢复至可执行状态。

    5、如果某个方法声明会抛出Throwable、Exception或子类实例,但又不属于java.lang.RuntimeException或其子类实例,就必须明确使用try、catch语法加以处理,或者用throws声明这个方法会抛出异常,否则会编译失败。

    6、Throwable、Exception或其子对象,但非属于RuntimeException或其子对象,称为受检异常。

    7、属于RuntimeException衍生出来的类实例,通常是事先无法预测错误是否发生的执行时期异常,编译程序不会强迫一定得在语法上加以处理,称为非受检异常。

    8、如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远不会被执行,编译程序会检查出这个错误。

    9、从JDK7开始,可以使用多重捕捉语法,不过仍得注意异常的继承,catch括号中,左边的异常不能是右边异常的父类,否则会发生编译错误。

    10、操作对象的过程中如果会抛出受检异常,但目前环境信息不足以处理异常,所以无法使用try、catch处理时,可由方法的客户端依据当时调用的环境信息进行处理。为了告诉编译程序这个事实,必须使用throws声明此方法会抛出的异常类型或父类型,编译程序才会允许通过编译。

    11、如果是非受检异常,原本就可以自行选择是否处理异常,因此不使用try、catch处理时也不用特别在方法上使用throws声明,不处理非受检异常时,异常会自动往外传播。

    12、在catch区块中进行完部分错误处理之后,可以使用throw(注意不是throws)将异常再抛出。

    13、在JDK7中,编译程序对于重新抛出的异常类型可以更精准判断。

    14、若想得知异常发生的根源,以及多重方法调用下异常的堆栈传播,可以利用异常对象自动收集的堆栈追踪来取得相关信息,例如调用异常对象的printStackTrace()、getStackTrace()等方法。

    15、要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为、对异常做了不适当的处理,或显示了不正确的信息。

    16、在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。如果想要让异常堆栈起点为重抛异常的地方,可以使用fillInStackTrace(),这个方法会重新装填异常堆栈,将起点设为重抛异常的地方,并返回Throwable对象。

    17、无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。如果程序撰写的流程中先return了,而且也有finally区块,finally区块会先执行完后,再将值返回。

    18、在JDK7之后,新增了尝试关闭资源(try-with-resources)语法,想要尝试自动关闭资源的对象,是撰写在try之后的括号中。

    19、若一个异常被catch后的处理过程引发另一个异常,通常会抛出第一个异常作为响应,addSupperssed()方法是JDK7在java.lang.Throwable中新增的方法,可将第二个异常记录在第一个异常之中,JDK7中与之对应的是getSupperssed()方法,可返回Throwable[],代表先前被addSupperssed()记录的各个异常对象。

    20、JDK7的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口,这是JDK7新增的接口。尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔。在try的括号中,越后面撰写的对象资源会越早被关闭。

    课后练习选择题:

    1、public class Main{

            public static void main(String[] args){

                   try{

                         int number = Integer.parseInt(args[0]);

                         System.out.println(number++);

                   }catch(NumberFormatException ex){

                         System.out.println(“必须输入数字”);

                   }

           }

    }

    执行时若没有指定命令行自变量,以下描述正确的是:显示ArrayIndexOutOfBoundException堆栈追踪。

     

    2、Object[] objs = {“java”,”7”};

         Integer number = (Integer) objs[1];

        System.out.println(number);

    以下描述正确的是:显示ClassCastException堆栈追踪

     

    3、public class Main{

            public static void main(String[] args){

                   try{

                         int number = Integer.parseInt(args[0]);

                         System.out.println(number++);

                   }catch(NumberFormatException ex){

                         System.out.println(“必须输入数字”);

                   }

           }

    }

    执行时若指定命令行自变量one,以下描述正确的是: 显示的必须输入数字。

     

    4、public class FileUtil{

                public static String readFile(String name) throws                {
                       FileInputStream input = new FileInputStream(name);
                       return null;
               }

    }

    方法名的throws关键字后要加FileNotFoundException ,声明该方法需要抛出找不到文件的异常。

     

    5、public static String readFile(String name) {
            try {
                FileInputStream input = new FileInputStream(name);
            } catch (              e) {
                e.printStackTrace();
            }
            return null;
        }

    catch括号中描述正确的是:填入Throwable或者FileNotFoundException可以通过编译。

     

    6、public class ExtendsDemo1 extends Resourse{
        @Override
        void doService() throws              {}
        
        public static void main(String[] args){

         }   
    }

    class Resourse{
        void doService() throws IOException{}
    }

    红色区域填入Error、IOException、FileNotFoundException选项都可以通过编译

    7、public class Main{

            public static void main(String[] args){

                   try{

                         int number = Integer.parseInt(args[0]);

                         System.out.println(number++);

                   }catch(ArrayIndexOutOfBouondException  | NumberFormatException ex){

                         System.out.println(“必须输入数字”);

                   }

           }

    }

    以下描述正确的是:显示”必须输入数字“。

     

    8、public static void main(String[] args){

             try{

                 int number = Integer.parseInt(args[0]);

                 System.out.println(number++);

           }catch(RuntimeException  | NumberFormatException ex){

                 System.out.println("必须输入数字");

           }

    }   

    以下描述正确的是:编译错误。

    注:因为左侧Runtime是右侧NumberFormatException的父类。

     

    9、public static String readFile(String name){
                try( FileInputStream input = new FileInputStream(name)){
                   
                }
             }

    以下描述正确的是:编译失败、

     

    10、try(ResourceSome some = new  ResourceSome();

            RsourceOther other = new ResouceOther()   

    以下描述正确的是:执行完try后先会关闭ResouceOther。

  • 相关阅读:
    数据库模糊查询
    Redis集群简介
    POI导出Excel的三种 workbook的区别
    mysql主从跳过错误
    MySQL server has gone away 问题解决方法
    Redis批量删除key的命令
    Python 3.6学习笔记(一)
    maven项目报错
    使用zabbix监控mysql的三种方式
    postgresql初体验
  • 原文地址:https://www.cnblogs.com/wanghongyun/p/6245320.html
Copyright © 2020-2023  润新知