异常的处理和throw与try...catch...(finally...)

文章尽量做到简练概述

通过对异常的分类和处理方式来理解有关异常的认识和处理

  1. 异常分类​​​​​​

  2. 异常处理

  3. throws和try..catch...(finnaly...)代码实例

  4. 温馨提示:规范与常见异常(interview)

Exception分为编译时异常和运行时异常

  • 编译时异常必须处理
  • 处理分为JVM处理--手动处理(抛出和捕获)

在此不过多讲述知识面的内容,很多书本和资料都有,只希望看完这篇文章可以清晰的处理异常,什么时候怎么用Throws和try...catch...

方式(1):thorws-->在出现异常的方法上,将异常抛出给调用者,调用者也可以继续把这个异常抛出去

public static void main(String[] args) throws FileNotFoundException {
        System.out.println("开始");
        copy(); // 此时这里必须处理这个编译时异常
        System.out.println("结束");//不打印
    }
/*public static void main(String[] args){
        System.out.println("程序开始");
        try {
            copy(); // 此时这里必须处理这个编译时异常
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("程序结束");
    }*/
public static void copy() throws FileNotFoundException {
        File file = new File("D:/meinv.jpg");
        // 自动出现一个编译时异常: 编译时异常编译阶段必须处理
        InputStream is = new FileInputStream(file);
    }

方式(2):try...catch...-->捕获并处理异常

格式 : try{ * // 可能出现异常的代码 * } catch(异常的类型 变量){ * // 如何处理 * }

提示:异常类型可以多个,也可以直接用Exception(不推荐)

public static void main(String[] args){
        System.out.println("程序开始");
        copy(); // 此时这里必须处理这个编译时异常
        System.out.println("程序结束");
    }
public static void copy() {
        File file = new File("D:/meinv.jpg");
        try {
            // 自动出现一个编译时异常: 编译时异常编译阶段必须处理
            // 出现异常 自己解决!
            InputStream is = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            // 输出异常信息,打印异常栈信息!程序不会死亡了,因为自己处理了!
            e.printStackTrace();
        }
    }
在以上代码中演示了,在main方法调用自定义方法,对编译异常的处理,
第1段代码在方法中抛出,调用者必须处理,可以继续抛出或者try...catch...
第2段代码如果已经try...catch...代表已经捕获并处理异常,在主方法中并不会报错,不影响后面代码的运行

理解好以上编译时异常,那么接下来更好接受运行时异常的处理!!!

运行时异常的处理:
在编译阶段,运行时异常即使不处理也不会报错!
运行时异常是无需通过 throws 往外抛出的,自动抛出的,程序员无需理会!
public static void main(String[] args) {
        try{
            System.out.println(chu(1,0));
        }catch (ArithmeticException e){
            e.printStackTrace(); // 打出异常信息
            System.out.println("我拦截到了异常!");
        }
        System.out.println("继续执行!");

    }

    public static int chu(int a , int b){ //throws ArithmeticException{
            System.out.println(a);
            System.out.println(b);
            // ArithmeticExceptio 数学运算异常
            int c = a / b ;
            return c ;
    }
提示:在规范中异常都应该处理
所以要考虑的只是,在哪个方法try...catch...;为不影响后面代码运行,即使不处理不报错,都应该选择try...catch...

拓展:

在try...catch...中,可以一个try...catch...catch...多个;也可以catch(异常1 | 异常2 ...变量)
注意:异常的级别关系
finally : 作用只有一个.关闭资源(无论程序是否出现异常,最终一定会执行一次finally)
          释放资源,节约资源!
JDK1.7以后资源关闭的新方式:
      try(
          // 只能放资源,就会在资源用完以后会自动关闭,程序员无需理会!
      ){
     }catch (Exception e){
         e.printStackTrace();
     }

自定义异常

throw new 异常类名(参数);

提示:在自定义一个RunnableException异常子类,在throw new 方法上不需要抛出throws(会有提示)

自定义异常的步骤:
    * 定义一个异常的子类:XxxException
    * 继承关系:RuntimeException或Exception
    * 提供构造方法:无参数和有参数构造方法

throws 在方法上抛出异常

throw 创建并从这里抛出异常

最后:

编译时常见异常:

 FileNotFoundException 文件找不到异常!

运行是异常:

ArrayIndexOutOfBoundsException 数组索引越界异常

NumberFormatException 数字转换异常

NullPointerException 空指针异常

ClassCastException 强制类型转换异常

面试可能会问到.

         
 

猜你喜欢

转载自blog.csdn.net/JzCm__/article/details/82056782