Java异常
什么是异常
Exception:软件程序在运行过程中遇到的各种问题。
文件找不到,网络连接失败,非法参数;
检查型异常:用户错误或者问题引起。在编译时不能简单的被忽略。
运行时异常:肯恶搞被避免,在编译时被忽略。
错误(error):错误不是异常,是脱离程序员控制的问题,例如栈溢出。是爱编译的时候无法检查到的。
异常体系结构
Java把异常当作对象来处理。定义了一个基类:java.lang.Throwable作为所有异常的超类。
Error类对象是由Java虚拟机生成并抛出,与执行操作无关。
例如:Java虚拟机运行错误,当JVM没有内存资源,会出现OutOfMemoryError错误,此时会终止线程。
再如:类定义错误(NoClassDefFoundError)连接错误(LinkageError)错误不可查。
Error和Exception的区别:Error是灾难性的错误,是程序无法控制和处理的,Exception是可以被程序处理的。
Java异常处理机制
抛出异常:
捕获异常
处理异常
五个关键字:
try、catch、finally、throw、throws
idea快捷键:ctrl+alt+t
throw主动抛出异常:一般在方法中使用:
public static void main(String[] args) {
new Oop02().test(2,0);
}
public void test(int a,int b){
if(b==0){
throw new ArithmeticException();//主动抛出异常
}else{
System.out.println(a/b);
}
}
输出结果:
Exception in thread "main" java.lang.ArithmeticException
at javademo.Oop02.test(Oop02.java:9)
at javademo.Oop02.main(Oop02.java:5)
Process finished with exit code 1
throws:方法处理不了这个异常,在方法上抛出异常。
public static void main(String[] args) {
try {
new Oop02().test(2,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
public void test(int a,int b)throws ArithmeticException{
if(b==0){
throw new ArithmeticException();//主动抛出异常
}else{
System.out.println(a/b);
}
}
输出结果:
java.lang.ArithmeticException
at javademo.Oop02.test(Oop02.java:13)
at javademo.Oop02.main(Oop02.java:6)
Process finished with exit code 0
自定义异常
其实大多数异常不需要自定义。
用户自定义异常类,需要继承Exception类
步骤:
1、创建自定义异常类;
2、在方法中通过throw关键字抛出异常对象;
3、如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步;
4、在出现方法的调用这种捕获并处理异常。
public class Oop02 extends Exception {
private int del;
public Oop02(int del) {
this.del = del;
}
@Override
public String toString() {
return "Oop02{" +
"del=" + del +
'}';
}
public static void main(String[] args) {
a(1);
}
static void a(int b){
if(b>10){
try {
throw new Oop02(b);
} catch (Oop02 oop02) {
oop02.printStackTrace();
}
}else {
System.out.println("111");
}
}
}
总结
1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理。
2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常。
3、对于不确定的代码,也可以加上try-catch,处理潜在的异常。
4、尽量去处理异常,切忌只是简单的调用printStackTrace()去打印。
5、具体如何去处理异常,要根据不同的业务需求和异常类型去决定。
6、尽量添加finally语句去释放占用的资源。