异常机制
一、怎么是异常
-
实际情况中,遇到 的情况不可能是完美的,比如,你写的某个模块,用户输入不一定符合你的要求,你的程序需要打开某个文件,这个文件可能不存在或者格式不对,
-
软件程序在运行的过程中,非常可能遇到以上的异常情况,我们叫异常:Exception
-
异常指程序运行中出现的不期而至的各种状况,如:文件找不到,网络连接失败,非法参数等
-
异常发生在程序运行期间,他影响程序执行流程。
二、简单分类
-
检查性异常:最具代表性的检查异常是用户错误或问题引起的异常,这是程序无法预见的,例如打开一个不存在的文件,一个异常就发生了,这些异常不能再编译时被简单忽略
-
运行时异常:是可能被程序员避免的异常,这个可以再编译时被忽略
-
错误ERROR:不是异常,是脱离程序员控制的问题。错误通常在代码中被忽略,例如,当栈溢出时,一个错误发生了,他们在编译时检查不到
三、异常的体系结构
-
Java把异常当成对象处理,并定义了一个基类:java.lang.Thowable作为异常的超类
-
在Java的API中定义了许多异常类,分为两个类,错误Error'和异常Exception
四、Error
-
Error类对象又java虚拟机生成并抛出,大多数错误与代码编写者所执行操作无关
-
java虚拟机运行错误,当JVM不在继续执行操作所需的内存资源时,将出现OutOfMemoryError,这些异常发生时,java虚拟机会选择线程终止
-
还有发生在虚拟机试图执行应用时,如果定义错误,链接错误,这些错误是不可查的,因为他们在应用的控制和处理之外的,而且绝大多数程序是不允许出现状况的
-
五、Exception
-
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
-
ArrayIndexOutOfBoundsException(数组下标越界异常)
-
NuullPointerException(控制值异常)
-
ArithmeticException(算数异常)
-
MissingResourceException(丢失资源)
-
ClassNotFoundException(找不到类)等异常,这些异常是不检查的异常,程序中可以选择捕获处理,也可不处理
-
-
这些异常是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免
-
Error和Exception区别
-
Error通常是致命性的错误,是程序无法控制和处理的,当出现这种异常,JVM一般会选择终止线程
-
Exception通常情况下可以被程序处理的,并且程序中应尽可能去处理这些异常
-
-
六、异常的处理机制
-
抛出异常
-
捕获异常
-
处理异常的五个关键字
-
try
-
catch
-
finally
-
throw
-
throws
-
-
package com.oop; public class Test { public static void main(String[] args) { int a = 1; int b = 0; //选中检查的代码,ctrl+alt+T // System.out.println(a/b); try{ new Test().test(1,0); }catch (ArithmeticException e){ e.printStackTrace(); } /* try{//监控区域 System.out.println(a/b); }catch (Error e ){//catch(想要捕获的异常类型)捕获异常 System.out.println("Error"); }catch (Exception e){ System.out.println("Exception"); }catch (Throwable e){ System.out.println("Ttrowable"); } finally {//处理善后工作,可以不要finally,假设IO,资源,关闭 System.out.println("finally"); } */ } //假设在这个方法中,处理不了这个异常,方法上抛出异常 public void test(int a,int b) throws ArithmeticException{ if (b==0){ System.out.println("程序异常,b不能为0"); throw new ArithmeticException();//主动抛出异常,一般用在方法中 } } }
-
七、自定义异常
-
使用java内置的异常类可以描述编程时遇到的大部分异常情况,除此之外,用户还可以自定义异常,只需继承Exception类即可
-
在程序中定义异常,大概步骤:
-
创建自定义异常类
-
在方法中通过throw关键字抛出异常
-
如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用着的异常,继续下一步操作
-
在出现异常方法的调用者中捕获并处理异常
-
-
package com.exception.demo01; public class MyException extends Exception { //传递数字>10 private int detail; public MyException(int a) { this.detail = a; } //toString:异常的打印信息 @Override public String toString() { return "MyException{" + "detail=" + detail + '}'; } } package com.exception.demo01; public class Test { //可能会存在异常的方法 static void test(int a) throws MyException{ System.out.println("传递参数为:"+a); if (a>10){ throw new MyException(a); } System.out.println("OK"); } public static void main(String[] args) { try{ test(11); }catch (MyException e ){ //增加一些处理异常的代码 System.out.println("MyException"+e); } } }
-
八、实际应用中的总结
-
处理运行异常时,采用逻辑去合理的规避同时辅助try-catch去处理
-
在多重catch语句块,可以加上一个catch(Exception)来处理可能会遗漏的异常
-
对于不确定的代码,也可以加上try-catch代码,处理潜在异常
-
尽量去处理异常,切忌只简单的调用printStackTrace()去打印输出
-
具体如何处理异常,要根据不同的业务需求和异常类型去决定
-
尽量添加finally语句块去释放资源