异常
什么是异常?
不正常就是异常
处理异常
通过大量的if判断来确保程序没有异常,但是客户是万恶之源,时常会有程序员没有想到的输入。再切,编写的判定逻辑不可能江所有情况都囊括经期,jvm的处理方式就是 暂停程序>报错(异常内容 [什么异常 原因描述] 异常行数,所以不要让jvm去处理异常.
通过if判定完成if判断完成一场校准是的代码臃肿,不利于阅读以及维护,而java中的提供了完整的异常处理方案,能够帮助我们在编写代码过程中,处理 程序中的异常信息。
try-catch
语法结构:
try{
//有可能出现异常的代码块
}catch(声明异常){
//异常解决办法
}
执行顺序:
执行try块中的内容
如果try块中的内容出现异常,执行catch块
匹配catch中的声明的异常信息,如果匹配上,则执行catch中的代码
继续执行后续代码
-
如果catch中异常信息未匹配到,那么此时交由jvm处理该异常
catch中的类型一定要注意 能要能够扑捉到try块中实际出现的信息
如果忘记具体异常信息可以使用Exception去捕获异常信息
try{
System.out.println(1/0);// new ArithmeticExpection();出现异常
}catch(Exception e){
//记录异常信息
System.out.println("除数不能为0");//不要再catch块中做业务逻辑判断
}
try-多层catch
语法结构:
try{
//可能出现异常的代码段
}catch(异常1){
//异常 的解决办法
}catch(异常2){
//异常 的解决办法
}.......{
}
执行顺序:
执行try块中的内容
如果try块中的内容出现异常,逐一匹配catch中的内容
匹配catch中的声明的异常信息,如果匹配上,则try-catch执行结束
-
如果catch中异常信息未匹配到,那么此时交由jvm处理该异常
注意事项:
- 在多重catch中一般情况下会在最后一个catch语句编写Exception,用来捕获可能为识别的异常信息
- 不要在第一个catch中编写父类异常(包括Exception),会使得其余的子类异常被屏蔽
try {
int num1 = input.nextInt();//InputMismatch
System.out.println("请输入第二个数》》》》》");
int num2 = input.nextInt();
int result = num1/num2;
System.out.println(num1+"/"+num2+"="+result);
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
//System.out.println(e.toString());
//e.printStackTrace();
System.out.println(e.getMessage());
}catch(InputMismatchException e) {
System.out.println("用户输入有误");
}catch(Exception e) {
System.out.println("网络加载问题。。。。");
}
异常对象的常用针对方法:
toString: 当前异常类型以及原因描述
printStackTrace: 打印堆栈信息 异常类型以及原因描述 异常位置
-
getMessage:获取
try-catch-finally
语法结构:
try{
//可能出现异常的代码
}catch(异常1){
//处理办法
}.....{
}finally{
//代码块
//关闭资源的代码
}
执行顺序:
1:执行try块 如果出现异常 new出当前异常对象
2:逐一匹配catch中的异常内容
3:如果匹配上 执行对应的catch中的代码
4:如果未匹配上 jvm去解决当前异常信息
5:不论是否匹配成功 都会执行finally中内容
try {
int num1 = input.nextInt();
System.out.println("请输入第二个数》》》》》");
int num2 = input.nextInt();////new IllegalStateException
int result = num1/num2;
System.out.println(num1+"/"+num2+"="+result);
System.exit(0);
return 1;
}catch(InputMismatchException e) {
System.out.println("输入有误");
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception e) {
System.out.println("网络加载有误。。");
}finally {
System.out.println("我是finally");
input.close();
}
如何能使得finally不执行
编写System.exit() 关闭虚拟机
改变:在jdk1.7之后 对于try-catch-finally的改变
可以对于流、网络连接对象的创建声明在try的()中,后续无需通过使用finally显式的关闭资源
try (Scanner input = new Scanner(System.in);
InputStream is = new FileInputStream(new File(""))){
System.out.println("请输入第一个数》》》》》");
int num1 = input.nextInt();
System.out.println("请输入第二个数》》》》》");
//input.close();
int num2 = input.nextInt();////new IllegalStateException
int result = num1/num2;
System.out.println(num1+"/"+num2+"="+result);
input.close();
}catch(InputMismatchException e) {
System.out.println("输入有误");
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception e) {//Exception e = new IllegalStateException
System.out.println("网络加载有误。。");
}
throw和throws
throw声明当前代码块中可能存在的异常信息 ,并且将当前异常信息抛出给调用者。而对于调用者而言,通过try-catch捕获异常,不管当前异常,交由jvm做
-
throw会导致当前程序中断,后续代码不再执行。
throws在方法外对外抛出异常,调用这解决当前异常。
main方法中对外抛出的异常全部交由jvm做
public static void main(String[] args) /* throws AgeException */{ //通常情况 throws 和throw配套使用 User u = new User(); try { u.setAge(-1); }catch(AgeException e) { //System.out.println("年龄有误。。。"); System.out.println(e.getMessage()); } System.out.println(u); }
自定义异常
1.jdk中提供的异常信息不满足目前的使用
2.自定义异常的方法
先声明一个自定义异常类 在使得该类继承Expection
最后编写一个空构造器 一个带参构造器
public class AgeException extends Exception{ public AgeException() { } // 当前异常的原因描述 public AgeException(String msg) { super(msg); } }