异常(Exception)
程序在执行过程中遇到的不正常情况(开发过程中的语法错误不算)
异常体系图
- 编译异常:java源程序——>java字节码文件
- 运行异常:java字节码文件——>在内存中加载
五大运行时异常
- NumberFormatException(数字格式异常)
- ClassCastException(类型转换异常)
- ArrayIndex0utOfBoundsException(数组下标越界)
- ArithmeticException(运算异常)
- NullPointerException(空指针)
异常处理机制
1.try-catch-finally
程序在运行是自动捕获异常并处理
//语法格式
try{
//有可能异常的代码
}catch(Exception e){
//异常过后的处理机制
}finally{//可有可无,根据需求选择
//最终执行
//不管上面有没有异常,finally都执行
}
细节
- 如果异常发生了,try-catch后面的代码将不会执行,直接进入catch块
- 如果异常没有发生,则按顺序执行try,不执行catch块
- 如果想不管有没有异常都执行,就在catch后面加finally。一般是关闭连接,释放资源
- 可以有多个catch捕获不同的异常,要求父类在前,子类在后
- 也可以直接使用try-finally,场景:执行一段代码,不管是否发生异常 ,都执行某个业务逻辑
2.throws
运行过程中的异常交给调用者处理,最定级调用者是jvm
class test{
public static void main(String[] args) /*throws Exception*/{
//这里如果不用try-catch,也可以在主方法加throws,让JVM抛出异常
try{
test.month();
}catch(Exception e){
//处理机制
}finally{
}
}
public static void month() throws Exception{
//这里是有可能异常的代码
}
}
- throws可以抛出异常列表,也就是可以抛出多个异常
- 对于编译时异常,必须处理
- 对于运行时异常,程序中如果没有处理,就由调用他的人处理
- 子类重新父类的方法时:子类抛出的异常要么和父类一样,要么是父类异常的子类异常
- 在throws过程中,如果有try-catch就不用throws了
自定义异常
class test{
public static void main(String[] args){
try{
//可能异常的代码
}catch(Exception e){
throws new TestException("自定义异常");
}
}
}
//可以继承两种异常
//1.Exception 编译时异常——使用后,在调用处需要throws
//2.RunTimeException 运行时异常
class TestException extends RunTimeException{//一般继承RunTimeException,运行时异常
public TestException(String message){
super(message);
}
}