Java-异常

一、使用try catch Exception

Error与Exception区别

  1. Error:JVM错误,此时程序并没有执行,无法处理;
  2. Exception:程序之中出现的错误信息,可以进行异常处理;

异常的处理流程

  1. 如果程序中产生了异常,则JVM自动会根据异常类型,实例化一个指定异常类的对象;
  2. 如果此时程序中没有人和异常handler,则这个异常类的实例化对象将交给JVM进行处理。JVM默认处理方式为输出异常信息,程序中断;
  3. 如果程序中存在异常handler,则会由try语句捕获产生的异常类对象;
  4. 异常会与try之后的每一个catch进行匹配,如果匹配成功,使用该catch进行处理;如果匹配失败,继续找下一个catch;如果没有catch与之对应,则该异常类对象会由JVM进行默认处理;
  5. 不管是否有异常,都会执行finally块儿。如果此时无异常,在执行完finally后,会继续执行后续代码;如果此时有异常未处理(没有catch相匹配),也会执行finally,但执行完finally后,会由JVM进行异常的默认处理,程序中断。
package com.joeaaa.demo09;

public class ExceptionTest1 {
    public static void main(String[] args) {
        /*
        * try ... catch ... finally
        */
        int a = 10;
        int b = 0;
        try {
            int res = a/b;
            System.out.println(res);
        }catch (Exception e){
            /*
            * 打印简单错误信息:java.lang.ArithmeticException: / by zero
            */
            System.out.println(e); 

            /*
            * java.lang.ArithmeticException: / by zero
            * at com.joeaaa.demo09.ExceptionTest1.main(ExceptionTest1.java:8)
            */
            e.printStackTrace(); // 打印详细的错误信息
        }finally {
            System.out.println("不管是否出错,都会执行");
        }
    }
}

二、使用throws处理

thorws关键字主要是在方法定义上使用的,表示此方法之中不进行异常的处理,而是交给被调用处处理。(不管是否有错,在调用时都要强制的进行异常处理try catch)

package com.joeaaa.demo09;

class MyMath{
    public int div(int x, int y) throws Exception{
        return x/y;
    }
}

public class ExceptionThrowsTest {
    public static void main(String[] args) {
        try {
            System.out.println(new MyMath().div(10,2));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

三、异常处理标准格式

package com.joeaaa.demo09;

class MyMath{
    // 出现异常要交给被调用处输出,使用throws
    public int div(int x, int y) throws Exception{
        System.out.println("---计算开始---"); // 资源打开
        int result = 0;
        try{
            result = x/y; 
        } catch (Exception e){
            throw e; // 向上抛
        }finally {
            System.out.println("---计算结束---"); // 资源关闭
        }
        return result;
    }
}
public class StandardExceptionHandler {
    public static void main(String[] args) {
        try {
            System.out.println(new MyMath().div(10,0));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
---计算开始---
---计算结束---
java.lang.ArithmeticException: / by zero
     at com.joeaaa.demo09.MyMath.div(StandardExceptionHandler.java:9)
     at com.joeaaa.demo09.StandardExceptionHandler.main(StandardExceptionHandler.java:21)

问:RuntimeException和Exception的区别,列举几个常见的RuntimeException

  1. RuntimeException是Exception的子类;
  2. Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性进行处理;
  3. 常见的RuntimeException有:NumberFormatException、ClassCastException、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException。

四、assert关键字(断言)

断言指的是程序执行到某行之后,其结果一定是预期的结果。

启用断言需要在执行时增加 -ea选项,java -ea Demo

五、自定义异常类

package com.joeaaa.demo09;

class MyException extends Exception{
    public MyException(String msg){
        super(msg);
    }
}

public class MyExceptionTest {
    public static void main(String[] args) throws Exception{
        throw new MyException("自定义异常类");
    }
}
Exception in thread "main" com.joeaaa.demo09.MyException: 自定义异常类
     at com.joeaaa.demo09.MyExceptionTest.main(MyExceptionTest.java:11)