异常机制
概念
异常指程序运行中出现的不期而至的各种状况,如:文件找不到,网络连接是吧,非法参数等,异常发生在程序运行期间;关键字:Exception
异常分类
检查性异常
- 最具代表的是用户错误或问题引起的异常,程序无法预见,例如打开一个不存在的文件
运行时异常
- 运行时异常是可以避免的异常,运行时异常可以在编译时被忽略
错误
- 错误不是异常,而是脱离程序控制的问题,例如栈溢出,他们在编译时无法检查
异常体系结构
- Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
- 在Java API中已经定义了许多异常,分为两大类,错误Error和异常Exception
Exception
程序中可以选择捕捉也可以选择不处理
- RuntimeException(运行时异常)
- NullPointerException(空指针异常)
- ArrayIndexOutOfBoundsException(数组下标越界)
- ArithmeticException(算术异常)
- MissingResourceException(丢失资源)
- ClassNotFoundException(找不到类)
Error和Exception的区别
Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能去处理这些异常
异常处理机制
快捷键,选中需要处理的代码:Ctrl+Alt+t
关键字
-
try:尝试处理异常
-
catch:用来捕获异常
-
finally:最后都会走finally,可以不要
-
throw:用于在方法中主动抛出异常
-
throws:用于在方法上抛出异常
package com.Exception; public class Demo01 { public static void main(String[] args) { new Demo01().test(1,0); int a = 1; int b = 0; //假设要捕获多个异常,要从小到大去捕获 try {//try监控区 new Demo01().a(); System.out.println(a/b); }catch (Error e){//捕获异常 System.out.println("Error"); }catch (Exception e){ System.out.println("Exception"); }catch (Throwable t){ System.out.println("Throwable"); }finally {//处理善后工作,可以不要 System.out.println("finally"); } } public void a(){ b(); } public void b(){ a(); } //假设这个方法处理不了这个异常,可以在方法上抛出这个异常 public void test(int a,int b) throws ArithmeticException{ if (b==0){ throw new ArithmeticException(); //主动抛出异常,一般在方法中使用 } System.out.println(a/b); } }
自定义异常
自定义异常的步骤
- 创建自定义异常类
- 在方法中通过throw关键字抛出异常对象
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步操作
- 在出现异常的调用者捕获并处理异常
注意
- 自定义异常必须继承Exception类
异常类例:
package com.Exception;
//自定义异常
public class MyException extends Exception{
private int detail;
//传递数字大于10
public MyException(int a) {
this.detail = a;
}
//异常的打印信息
@Override
public String toString() {
return "MyException{" + "detail=" + detail + '}';
}
}
使用这个异常例:
package com.Exception;
import java.awt.datatransfer.MimeTypeParseException;
public class Test {
static void test(int a) throws MyException {
if (a>10){
throw new MyException(a); //抛出异常
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(19);
} catch (MyException e) {
System.out.println(e);
}
}
}
总结:
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 做多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切记只是简单的调用printStackTrace()去打印输出
- 尽量添加finally语句块去释放占用资源