关键字:try
、catch
、 finally
、 throw
、 throws
- try - 代码块中会被监控,如果提前可以知道某段代码可能会出现异常,就放入try代码块中
- catch - 用来捕获异常,catch的参数为需要捕获的异常类型,如果try中的代码出现对应的异常,就执行catch代码块中的代码 catch(需要捕获的异常类型)
- finally - 一般处理善后工作,不管有没有出现异常都会执行
- throw - 主动抛出异常,不管什么情况,执行到这里就会抛出异常,一般在方法的内部使用
- throws - 假设方法中处理不了该异常,那么在方法上提前抛出异常,主要表示该方法可能会出现异常,由方法的调用者来处理
结合示例理解:
try
、catch
、finally
:
public static void main(String[] args) {
//众所周知,除数不能为0,所以在这里捕获异常,当
try { //try - 监控区域
System.out.println(1/0);
} catch (Exception e) { //catch - 程序出现异常时执行
System.out.println("catch");
} finally { //finally - 一般用来处理善后工作(一定会执行)
System.out.println("finally");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryey3gbH-1626431778266)(D:\Study\自学\附图\异常处理测试.png)]
运行结果如图所示。
throw
、throws
:
public class Test1 {
public static void main(String[] args) {
try {
new Test1().test1(1, 0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
//方法头中的throws表示方法内可能出现ArithmeticException类型的异常,需要调用者注意处理
public void test1(int num1, int num2) throws ArithmeticException{
if(num2 == 0){
//主动抛出的异常一定会执行,表示如果num2等于0,就抛出ArithmeticException类型的异常
throw new ArithmeticException();//主动抛出异常
}else {
System.out.println(num1/num2);
}
}
}
为什么test1方法中已经利用if判断和throw主动抛出了异常,在实际调用test1时还用try和catch捕获?
因为即使主动抛出了异常,实际调用的时候发现了异常程序就立马停止了,使用try和catch进行捕获之后,程序不会停止,而是继续执行后续的代码操作。可以在上述的案例程序中,添加一段接收数据的代码,将程序暂停来验证。
public static void main(String[] args) { //使用try的情况,程序会暂停等待用户输入数据 try { new Test1().test1(1, 0); } catch (ArithmeticException e) { e.printStackTrace(); } //new Test1().test1(1, 0);//直接调用的情况,程序将直接终止 //在之前的代码中添加这一段代码 使程序暂停,从而观察程序的运行情况 Scanner scanner = new Scanner(System.in); scanner.nextLine(); scanner.close(); }
throw和throws有什么区别?
throw:
- 在方法内部使用
- 主动抛出异常,执行throw则一定抛出了某种异常
- 执行到throw之后,后面的代码将不会再执行
throws:
- 在方法签名中使用
- 表示出现异常的一种可能性,并不一定会发生这些异常
- 需要方法的调用者进行异常处理