JavaSE进阶七 异常

2021-06-11  本文已影响0人  SimonLike

1,异常机制

代码示例
public class ExceptionTest01 {
    public static void main(String[] args) {
        // System.out.println(10/0);// 出现异常  Exception in thread "main" java.lang.ArithmeticException:

        // 通过"异常类"实例化异常对象
        NumberFormatException numberFormatException = new NumberFormatException("数字格式化异常!");
        System.out.println(numberFormatException);
        NullPointerException nullPointerException = new NullPointerException("空指针异常!");
        System.out.println(nullPointerException);
    }

}

2,异常的存在形式

3,异常的处理

3.1 分析异常案例

public class ExceptionTest02 {
    public static void main(String[] args)  {
        /*
            System.out.println(100/0);
            程序执行发生了ArithmeticException异常,底层new了一个ArithmeticException异常对象,
            然后抛出了,由于是main方法调用了"100/0",所以这异常ArithmeticException抛给了main
            方法,main方法没有处理,将这个异常抛给了JVM,JVM终止了程序的执行。

            ArithmeticException继承RunTimeException,属于运行时异常,
            在编写程序阶段不需要对这种异常进行预先处理。
         */
        // System.out.println(100/0);
        // ------------------------------------------------------------------------------

        // 调用doSome方法
        // 因为doSome方法声明位置上有throws ClassNotFoundException
        // 所以我们在调用doSome方法时候必须对这种异常进行预先处理,如果不处理编译器会报错
        // 编译报错信息: java: 未报告的异常错误java.lang.ClassNotFoundException; 必须对其进行捕获或声明以便抛出
       
        // doSome();

    }

    /**
     * doSome方法在方法声明的位置使用了throws ClassNotFoundException
     * 表示doSome方法在执行过程中,有可能会出现ClassNotFoundException异常
     * 叫做类没有找到异常,这个异常值接父类Exception,所以ClassNotFoundException属于编译异常
     * @throws ClassNotFoundException
     */
    public static void doSome() throws ClassNotFoundException{
        System.out.println("ClassNotFoundException");
    }
}

3.2 处理异常

public class ExceptionTest03 {

    // 第一种处理方式,在声明方法的位置上继续使用throws,异常继续上抛,抛给调用者。
//    public static void main(String[] args) throws ClassNotFoundException {
//        doSome();
//    }

    public static void main(String[] args) {
        // 第二种处理方式:try..catch进行捕捉
        try {
            doSome();
        } catch (ClassNotFoundException e) {
            // catch捕捉异常之后,处理异常
            e.printStackTrace();
        }
    }

    /**
     * doSome方法在方法声明的位置使用了throws ClassNotFoundException
     * 表示doSome方法在执行过程中,有可能会出现ClassNotFoundException异常
     * 叫做类没有找到异常,这个异常值接父类Exception,所以ClassNotFoundException属于编译异常
     * @throws ClassNotFoundException
     */
    public static void doSome() throws ClassNotFoundException{
        System.out.println("ClassNotFoundException");
    }
}

3.3 异常对象的两个重要方法:

代码示例
public class ExceptionTest05 {
    public static void main(String[] args) {
        NullPointerException e = new NullPointerException("空指针异常");
        String msg = e.getMessage();
        System.out.println(msg);// 空指针异常
        //  打印异常追踪的堆栈信息
        e.printStackTrace(); // java.lang.NullPointerException: 空指针异常

        System.out.println("hello world"); // e.printStackTrace();  不影响hello world的输出
    }
}

3.4 处理异常深入了解try..catch

代码示例
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ExceptionTest04 {
    public static void main(String[] args) {

        try {
            FileInputStream fis = new FileInputStream("");
            fis.read();
            //
            System.out.println(100/0); // 这个异常是运行时异常,编写程序时可以处理,也可以不处理。
        }catch (FileNotFoundException e){ // 所有异常都走catch分支
            System.out.println("文件不存在");
        }catch (ArithmeticException | NullPointerException e){ // jdk8之后新特性 可以用|的形式编写
            System.out.println("读取文件失败");
        }catch (IOException e){

        }
    }
}

3.5 关于try..catch中finally子句

代码示例
public class ExceptionTest06 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 创建输入流对象
            fis = new FileInputStream("");
            String s = null;
            s.toString(); // 这里会出现空指针异常

            // 流使用完需要关闭,因为流是占用资源的
            // 即使程序出现了异常,流也必须关闭!
            // 放在这里有可能关闭不了。
            fis.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }catch (NullPointerException e){
            e.printStackTrace();
        }finally {
            // 流的关闭放在这里比较保险,finally中的代码一定会执行的。
            if (fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3.6 finally面试题

3.6.1 final、finally、finalize有什么区别
3.6.2 分析下面程序的运行结果
public class ExceptionTest08 {
    public static void main(String[] args) {
        int result = m();
        System.out.println(result);// 100
    }
    /*
        java语法规则
            方法体中的代码必须遵循自上而下顺序依次执行,
            return语句一旦执行,整个方法必须结束。
     */

    public static int m(){
        int i = 100;
        try {
            // 这行代码出现在int i = 100的下面,所以最终结果必须是返回100
            // return语句还必须保证是最后执行的,一旦执行整个方法结束。
            return i;
        }finally {
            i++;
        }
    }
}

上篇:JavaSE进阶六 通用类
下篇:JavaSE进阶八 集合一 Collection接口

上一篇下一篇

猜你喜欢

热点阅读