异常 Exception
定义:
在程序运行过程中,发生了不正常的现象,阻止了程序的运行,称之为异常。举例:
public class Test01 {
public static void main(String[] args) {
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);
}
}
输入与定义的数据类型不匹配:InputMismatchException
除数输入为0:ArithmeticException
用if-else处理异常
- 代码臃肿,业务代码和处理异常的代码混在一起,
- 可读性差
- 程序员需要花费大量时间精力来维护这个漏洞
- 程序员很难堵住所有的漏洞
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个数:");
if(sc.hasNextInt()){
int num1 = sc.nextInt();
System.out.println("请录入第二个数:");
if(sc.hasNextInt()){
int num2 = sc.nextInt();
if(num2 == 0){
System.out.println("除数不能为0");
}else{
System.out.println("商是:" + num1/num2);
}
}else{
System.out.println("输入非int类型");
}
}else{
System.out.println("输入非int类型");
}
}
}
try-catch捕获异常
原理:
将可能出现异常的代码放在try代码块中,将一场封装成Exception对象,被catch后面的()异常对象接收,执行catch中的代码。代码不会出现中断。
- try未出现异常,try代码块执行,catch代码块不执行
- try出现异常,try代码块不执行,catch进行捕获:
与Exception类型匹配,走catch代码块,进行捕获
与Exception类型不匹配,没有捕获成功,程序中断。
public class Test01 {
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 ex){
System.out.println("出现异常!");
}
}
}
catch中异常处理方式
- 不处理:catch代码块中什么都没有写
- 输出自定义信息:
System.out.println(“出现异常!”); - 打印异常信息:
(1)调用toString方法,显示异常的类名(全限定路径)
System.out.println(ex);
System.out.println(ex.toString());
(2)显示异常描述信息,如果没有显示null
System.out.println(ex.getMessage());
(3)显示异常的堆栈信息
ex.printStackTrace();
- 抛出异常:
throw ex;
finally
在什么情况下try-catch后面的代码不执行
- throw抛出异常的情况
- catch中没有匹配的异常对象的类型 进行捕获
- try中遇到return
怎么try-catch后面的代码必须执行?
必须将执行的代码放入finally中,那么代码如论如何一定执行。
return和finally执行顺序?
先执行finally后执行return
什么代码放在finally中?
关闭数据库资源
关闭io流
关闭socket资源
有一种情况finally中不执行:
try代码块中包含:
System.exit(0);