异常机制
什么是异常
- 实际工作中遇到的情况不一定是完美的,例,你写某个模块,用户的输入不一定是正确的。你要打开某一个文件可是这个文件不一定存在,或者文件格式不对。你读取数据库数据,但数据库可能是空的。等问题
- 软件运行过程中,非常可能遇到我能提到的异常问题,异常(exception)。让我们写的程序做出合理的处理,而不至于奔溃。
- 异常指程序运行中各种不期而至的问题,例,文件找不到,网络异常,非法参数等
- 异常发生在程序运行期间,它影响正常的程序运行
异常体系结构
- java把异常当做对象来处理,并定义了一个基类,java.lang.Throwable,作为异常的超类
- 在java的API中已经定义了非常多的异常类,这些异常类分为两大类,错误(Error)和异常(Exception)
Error
- Error类对象,由java虚拟机生成并抛出,大多数错误与代码的编写者所执行的操作无关
- java虚拟机运行错误(Virtual MachineError)。当JVM不再有继续执行操作时的内存资源时,将出现OutOfMemoryError。当这些错误1发生时JVM一般会选择终止线程。
Exception
-
Exception中有一个重要的分支,RunTimeException(运行时异常)
-
NullPointerException:空指针异常
-
ArrayOutOfBoundsException:数组下标越界异常
-
ArithmeticException:数学计算异常
-
ClassNotFoundException:类文件未找到异常
-
MissingResourceException:丢失资源异常
-
以上异常是不检查的异常,程序中可以选择捕获处理,也可以选择不处理
-
这些异常一般由程序的逻辑错误引起,程序应该从程序逻辑的角度避免这些错误的出现
-
-
Error和Exception的区别;Error通常是灾难性的致命错误,是程序无法控制处理的。当出现这些错误时,java虚拟机(JVM)会直接终止线程。Exception通常是可以被程序处理的,并且在程序中应该尽量去处理这些异常
异常的处理机制
- 抛出异常
- 捕获异常
- 吃力异常的五个关键字
- try
- catch:捕获
- finally:无论是否执行都会去做的
- throw
- throws
- 快捷键,Ctrl+Alt+T
package exception;
public class Test {
public static void main(String[] args) {
try {
new Test().test(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
public void test(int a, int b) throws ArithmeticException{
//假设这个方法中处理不了这个异常,方法可以向上抛出异常
if (b == 0) {//主动抛出异常 throw throws
throw new ArithmeticException();//主动抛出异常,一般在方法中使用
}
}
}
/*
int a=1;
int b=0;
//分母不能为0
try{//用于监控区域
if(b==0){//主动抛出异常 throw throws
throw new ArithmeticException();//主动抛出异常
}
System.out.println(a/b);
}catch (ArithmeticException e){//catch(想要捕获的异常类型) 用来捕获异常
System.out.println("程序出现异常");
}finally {//处理善后工作,无论是否有异常都会执行
System.out.println("异常处理完毕");
}//try catch必须要有 finally可有,也可没有,常用于IO流,资源的关闭
System.out.println("===================================");
//假设要捕获多个异常,要从小到大
try{
new Test().a();
}catch(StackOverflowError w){
System.out.println("StackOverflowError出现问题");
}catch (Exception u){
System.out.println("Exception出现问题");
} catch(Error y){
System.out.println("Error出现问题");
}catch (Throwable t){
System.out.println("Throwable出现问题");
}finally {//处理善后工作,无论是否有异常都会执行
System.out.println("异常处理完毕");
}
}
//StackOverflowError
public void a(){
b();
}
public void b(){
a();
}
*/
/*
package exception;
public class Test2 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//快捷键,Ctrl+Alt+T
try {
System.out.println(a / b);
} catch (Exception e) {
e.printStackTrace();//打印错误信息
} finally {
}
}
}
*/
自定义异常
-
使用java内置的异常类可以解决编程时出现的大部分异常,除此之外用户还可以自定义异常。用户自定义异常,只需继承Exception类即可。
-
在程序中使用自定义异常,可以分为以下几步
- 创建自定义异常类
- 在方法中通过throw关键字,抛出异常关键字
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句进行处理。否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,然后进行下一步操作
- 在出现异常的方法中,调用者捕获异常并进行处理
-
异常总结
- 处理运行时异常时,采用逻辑去合理规避同时使用try-catch去处理
- 在多重的的catch块后面,可以再加上一个一个catch(Exception)来处理被遗漏的异常
- 对于不确定的代码,可以使用try-catch,处理潜在异常
- 尽量去处理异常,切忌只是简单地调用printStackTrace()去输出打印
- 具体如何处理异常,要跟具不同的业务需求和异常类型去决定
- 尽量添加finally语句,去释放资源