异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类
异常类如果使用正确,可以提高程序的可读性,可靠性和可维护性,如果使用不当会带来负面效果
java异常体系
Java 异常强制用户考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应处理
java中所有的异常类型都是 java.lang.Throwable的子类,分为两种类型Error错误和Exception异常
Error
程序中无法处理的错误,表示运行应用程序中出现了严重的错误,出现此类异常,JVM将终止线程
比如:
Exception
运行时异常:
此类异常实现都是RuntimeException类及其子类
运行时异常不必在代码中强制进行try-catch
这类异常通常由程序逻辑错误引起,应尽量避免此类异常的发生
非运行时异常
除了运行时异常外,继承了Exception的异常类
非运行时异常必须要在程序中进行try-catch,如果不处理,则程序编译不通过
自定义异常
自定义异常需要继承Exception类
public class WarnException extends Exception {
public WarnException(String message) {
super(message);
}
}
测试:
public static void test() throws WarnException{
try {
int i= 1/0;
}catch (Exception e){
throw new WarnException("自定义异常");
}
}
异常信息:
异常处理流程
捕获异常:
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
}
执行流程:
正常try-catch中无异常时:执行顺序是try - finally
正常try-catch中有异常时:执行顺序是try - catch - finally
捕获多重异常:
try{
}catch(WarnException we){
}catch(Exception e){
}finally{
}
try代码块后跟多个catch代码块,这种情况就叫多重捕获
抛出异常:
public static void test() throws WarnException{
try {
int i= 1/0;
}catch (Exception e){
throw new WarnException("自定义异常");
}
}
在方法上抛出异常使用throws关键字,如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来抛出这个异常
在方法内抛出异常使用throw关键字
常见异常
Error:
- NoClassDefFoundError:类定义错误
- OutOfMemoryError:内存溢出错误
- StackOverflowError:堆栈溢出错误
- UnknownError:未知错误
RuntimeException/运行时异常:
- NullPointerException:空指针异常
- NumberFormatException:数字格式异常
- ClassCastException:类型转换异常
- IndexOutOfBoundsException:索引越界异常
非运行时异常:
- IOException:IO异常
- SQLException:sql异常
- FileNotFoundException:文件找不到异常
- ClassNotFoundException:找不到类异常