Java异常处理 try catch finally 多重catch 异常分类处理
输入两个数进行求商
使用if-else语句实现实现处理异常
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数:");
if (sc.hasNextInt()) {
int firstInt = sc.nextInt();
System.out.println("请输入第二个数:");
if (sc.hasNextInt()) {
int secondInt = sc.nextInt();
if (secondInt == 0) {
System.out.println("除数不能为0");
} else {
System.out.println("商:" + firstInt / secondInt);
}
} else {
System.out.println("第二个数不是int类型的数据!");
}
} else {
System.out.println("第一个数不是int类型的数据!");
}
}
}
用if-else堵漏洞的缺点:
- 代码臃肿、可读性差,业务代码和处理异常的代码混在一起
- 程序员需要花费大量的经历来维护这个漏洞且很难堵住所有的漏洞。
使用try-catch处理异常
public class Test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数:");
int num1 = sc.nextInt();
System.out.println("请录入第二个数:");
int num2 = sc.nextInt();
System.out.println("商:" + num1 / num2);
} catch (Exception e) {
System.out.println(e);
}
}
}
- 当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常事件的代码。
- 寻找的过程从生成异常对象的代码块开始,沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这种类型的异常为止。然后Java运行时系统把当前异常对象交给这个方法进行处理。这一过程称为捕获(catch)异常。
- 如果Java运行时系统找不到可以捕获异常的方法,则Java运行时系统终止,相应的Java程序也将退出。
原理:把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的( e )中异常对象接收;接收以后,执行catch后面的{ }里面的代码,try-catch后面的代码不受影响。
- try中没有异常,catch中代码不执行;try中有异常,catch进行捕获
- 如果catch中异常类型和抛出的异常类型匹配:成功捕获,执行catch中的代码
- 如果catch中异常类型和抛出的异常类型不匹配:未成功捕获,不执行catch中的代码,程序相当于遇到了无法处理的异常,程序中断,后续代码不执行
Note:try中如果出现异常且用catch捕获成功,那么try中后续的代码是不会执行的;当然没捕获成功程序中断也不会执行。如果catch捕获异常成功,程序不会中断,那么try-catch后面的代码没有影响。
catch异常处理方式
-
佛系处理:什么都不写,什么都不做
-
我行我素:输出自定义异常信息
-
中规中矩:打印异常信息
- 调用toString方法,显示异常的类名(全限定路径)
- 显示异常描述信息对应的字符串,如果没有就显示null
- 显示异常的堆栈信息
-
破罐子破摔:异常抛回
对一些特定的异常可以再使用代码补救,比如被除数为0,可以在catch中再输入一次
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//实现一个功能:键盘录入两个数,求商:
try {
Scanner sc = new Scanner(System.in);
System