Throwable下的Excepion类需要我们注意,因为这个类是用来处理程序中人为造成的异常的。
异常分为运行时异常(比如把0当分母,能够编译,但是运行会有异常)和编译时异常,编译时异常必须先行处理。对于异常,我们可以捕获处理,也可以抛出处理。
1.捕获异常。
捕获异常常用的是try catch finally 语句块
public class Demo {
public static void main(String[] args) {
int [] nums = new int[4];
try {
System.out.println(1/0);
System.out.println(nums[4]);
System.out.println(nums[4]);
}catch (ArithmeticException e) {
e.printStackTrace();
return;
}catch (Exception e) {
e.printStackTrace();
return;
}finally {
System.out.println("就算在catch语句块中使用了return,finally语句块照样要执行");
}
System.out.println("捕获异常后程序继续执行");
}
}
把可能出现异常的语句放入try语句块中,如果出现异常就把异常类型跟catch语句中的异常类型作比较,匹配成功就是执行catch中的语句。最后不管是否匹配成功,finally都将执行。就算在匹配成功的catch语句块中已经执行了return,finally还是会执行,但是区别在于:当没有执行过return时,执行finally后能继续执行后面的语句,如果是执行过return后才执行的finally,则在finally执行完毕后程序结束。仅当执行了System.exit(1),finally才不会执行。
值得注意的是,当在try中遇到了第一个异常后,try剩余的还没执行的语句均不再执行。
2.抛出异常
2.1 用throw抛出异常类创建的对象:比如
public class ThrowKey {
public double div(double a,double b) {
return a/b;
}
public static void main(String[] args) {
int b = 0;
if(b==0) {
throw new UnsupportedOperationException();
}
}
}
要注意,如果抛出的是编译时异常的对象,则需要用try catch 或throws :比如
public class ThrowKey {
public double div(double a,double b) {
return a/b;
}
public static void main(String[] args) throws Exception {
int b = 0;
if(b==0) {
//throw new UnsupportedOperationException();
throw new Exception();
}
}
}
public class ThrowKey {
public double div(double a,double b) {
return a/b;
}
public static void main(String[] args) {
int b = 0;
if(b==0) {
//throw new UnsupportedOperationException();
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.2用throws关键字抛出异常类: 比如
public class ThrowsKey {
public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException{
try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
}
int [] nums = new int [4];
System.out.println(nums[5]);
}
}
例子中System.out.println(1/0);已经被try catch语句块所包裹,ArithmeticException并不需要用throws抛出。System.out.println(nums[5]);没有被try catch语句块包裹,有必要使用throws抛出,但不是必要的,因为它并不是编译时异常。一般来说编译时异常要么自己 try catch处理,要么使用throws抛出,但抛出后一定是要处理的,这个异常不可能平白无故消失,只是有人替你把异常处理了。