异常:
1、异常不上编译错误,编译错误是运行之前就检查出的
2、异常是程序运行过程中出现不正常现象
异常的危害
1、从出现异常的语句开始,程序就中断了
2、提供异常的信息不友好
异常处理机制
为什么需要有异常的处理机制,
如果使用if......else来处理代码漏洞,这个不上一个长久之计
1、首先如果是使用if ......else会使代码非常臃肿
2、处理异常的代码和执行功能的代码在一起会十分混乱
3、不能堵住所有的漏洞
异常处理机制的方式
1、try......catch:
原理:
1、try语句块,:有可能出现异常的代码
2、catch语句块:如果异常被成功捕获了,处理异常的代码
3、如果出现异常,try语句块李出现异常的语句开始,try语句块之后的代码就不会执行
4、如果catch了异常,执行异常处理语句,执行完成后面程序不会中断,还会继续执行
5、如果没有catch住程序一样会执行
catch语句块
1、printStatchTrace();
2、getMessage();
System.out.print(e.getMessage());
3、System.err.println("自定义需要输出的错误信息")
4、System.out.println("自定义输出信息")
5、toString();
System.out.print(e);
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a,b,c;
try {
System.out.println("请输入被除数");
a=sc.nextInt();
System.out.println("请输入除数");
b=sc.nextInt();
System.out.println("结果");
c=a/b;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("输出");
System.err.println("格式不对");
System.err.println(e);
System.out.println("输出错误");
System.out.println(e);
}
}
}
2、异常处理机制,try后面跟多个catch语句块
try......catch......catch:
执行原理:从上到小依次匹配catch语句中的异常类型,执行第一个匹配到catch语句块,如果后面还有匹配的也不在执行,跳出try......catch结构执行后面的语句,如果能catch异常,就执行一条
catch语句的顺序,子类型放在前面,父类型放在后面
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a,b,c;
try {
System.out.println("请输入被除数");
a=sc.nextInt();
System.out.println("请输入除数");
b=sc.nextInt();
System.out.println("结果");
c=a/b;
System.out.println(c);
} catch (InputMismatchException e) {
System.out.println("输入的数据格式不对");
}catch(ArithmeticException e){
System.out.println("除数不能是零");
}catch(Exception e){
System.out.println("程序出现异常");
}
System.out.println("代码继续执行");
}
}
3、异常处理机制:try......catch......finally
finally的执行结果:
1、没有异常:能执行
2、有异常,捕获到了:能执行
3、有异常,没捕获到:能执行
4、finally语句前如果有return,先执行finally在执行return
5、System.exit(1);退出虚拟机,只有这种情况,finally才不执行
finally语句一般是收尾语句,如关闭资源,断开连接等
java
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a,b,c;
try {
System.out.println("请输入被除数");
a=sc.nextInt();
System.out.println("请输入除数");
b=sc.nextInt();
System.out.println("结果");
c=a/b;
System.out.println(c);
} catch (InputMismatchException e) {
System.out.println("输入的数据格式不对");
}catch(ArithmeticException e){
System.out.println("除数不能是零");
}catch(Exception e){
System.out.println("程序出现异常");
}finally{
System.out.println("执行finally语句");
}
System.out.println("代码继续执行");
}
}