# 异常

在开发中,程序的编译主要是针对语法检测,而程序运行时可能会出现很多问题,在Java中这些运行时问题被称作异常,现在来看下异常的基本处理方式:

public class Main {
    public static void main(String[] args) {
        try {
            int a= 10/0;
        }catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("ArithmeticException:"+e);
            //查看出现异常的地方
            e.printStackTrace();
        }catch (Exception e) {
            System.out.println("Exception:"+e);
            // TODO: handle exception
        }finally {
            System.out.println("执行finally!");
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

注意:

  • 所有异常最高继承类是Throwable,它下面有两个子类,Error和Exception。Error是无法处理的,Exception就是可被捕获的异常。
  • 处理多个异常时,范围小的异常要放在范围大的异常前面,一般是子类在前,父类在后。

# 抛出异常

# throws

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

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(MathOper.div(10,2));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

上面MathOper中div方法的throws表明该方法可能会出现异常,要求调用该方法的地方捕获处理异常。当然在Main中如果会继续抛出异常,需要在main中也使用throws。

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(MathOper.div(10, 0));
    }
}
1
2
3
4
5

# throw

public class Main {
    public static void main(String[] args){
        try {
            throw new Exception("自定义异常!");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10

# 注意

  • throw主要是手动抛出某个异常,而throws则是向外部声明某方法会抛出异常。
  • 正常在类的方法中不处理异常,要抛出异常给调用处,如果不抛出异常,默认会执行throw后自动抛出。

# RuntimeException

RuntimeException类最大的特征在于,程序在编译的时候不会强制性地要求用户处理,可处理可不处理,如果没有处理且发生异常,将交给JVM默认处理。

注意:

  • RuntimeException是Exception的子类。常见的RuntimeException子类是:NumberFormatException,ClassCastException,NullPointerException,ArithmeticException,ArrayIndexOutOfBoundsException。
  • RuntimeException定义的异常可选择性地处理,Exception定义了必须处理的异常。
  • 当用户自定义异常类时可继承Exception类或RuntimeException。
  • 使用assert断言后,在运行时需要使用-ea开启断言,在不满足断言的地方会抛出异常。