# 异常
在开发中,程序的编译主要是针对语法检测,而程序运行时可能会出现很多问题,在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
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
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
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
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开启断言,在不满足断言的地方会抛出异常。