异常:Java程序在运行过程中出现的错误。
- 分类:
- Error:严重问题
- Exception:非严重问题(分类)(主要学习)
- 编译期异常:不属于RunTimeException的异常 (处理)
- 运行期异常: RunTimeException及其子类(不处理)
- jvm默认处理异常:控制台默认处理:展示异常 结束程序
- 处理方式:
- try …catch
- Throws
Java的异常处理机制可以让程序具有良好的容错性 让程序更加健壮。当出现意外是,Java会自动生成一个Exception对象来通知程序 从而将 实现代码 和错误代码分离,提供更好的可读性。
try{
可能出现问题的代码
}catch(异常名){
针对问题的处理方式
}finally{
释放资源
}
注意事项:
- try里面代码越少越好 (哪里有问题放在try块里面)
- catch块里面 必须有东西 哪怕是提示错误也行。
- 一旦try块有问题,就抛出异常,与相对的catch块匹配处理 然后执行 try。。。catch后面的语句 。有问题的后面暂不做处理
- 尽量明确异常的类型,不要直接使用父类Exception
- 父在后,子在前。(可以多个catch捕获,但是父类异常必须放在子类异常之后,否则jvm捕获时,会直接捕获父异常忽略子异常)
- 多异常捕获的时候,这些异常必须是平级关系。
try{
可能出现问题的代码
}catch(异常名|异常名|异常名|。。。。变量){ //多异常捕获
针对问题的处理方式
}finally{
释放资源
}
- 编译期异常:java程序必须显示处理,否则就会发生错误,无法通过编译
- 运行期异常:无需显示处理,也可以和编译异常一样处理,如果不处理,jvm将自动处理。处理结果:打印异常信息,结束程序。
- GetMassage():返回thorwable及其子类异常的详细消息字符串(可以为 null)
- toString():返回简单异常信息描述。内容:
- 此对象的类的 name
- ": "(冒号和一个空格)
- 调用此对象getLocalizedMessage() 方法的结果
- getLocalizedMessage() :此 throwable 的本地化描述。
关键字:throws
- 在方法声明上抛出异常 告诉调用者,有异常必须得处理。(在本方法中出现异常,若在本方法中不想处理可以在本方法签名后面使用throws+异常类进行抛出,由调用本方法的类或者方法处理这个异常)
- 小结:
- 编译期异常抛出 调用者必须处理
- 运行期异常抛出 调用者可以不处理
- throws 可抛出多个异常名。
关键字:throw
- 用在方法体内,后跟异常对象名,只能抛出一个异常对象名。
- 表示抛出异常,由方法体内的语句处理
- throw则是抛出了异常,执行throw则一定是抛出了某种异常
- 如何处理:
- 如果功能内部可以将异常处理 就用try。。catch
- 如果处理不了就用throws抛出,让调用者处理该异常
throw和throws的区别:
- 区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;
throw语法:throw <异常对象>
在方法声明中,添加throws子句表示该方法将抛出异常。
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。 - 区别二:throws可以单独使用,但throw不能;
- 区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。
关键字:finally
- 被finally控制的语句一定会执行(除非在finally块之前,jvm退出,使用system.exit())
- 作用:释放资源
- 格式: try。。。catch。。。finally
final,finally,finalize区别
- final: 修饰类,方法,变量
- finally:异常处理的一部分 用于释放 资源
- finalize:Object类的方法,回收垃圾。
- 注意:
- 当catch块里有exit()时,程序将不再执行final块的内容。
- 当catch快里有return语句时,final语句将在return语句前面一步执行,再去执行catch块的return语句。
- 当fianl和catch块里都有return语句时候,会执行final块的return语句。不会再去执行catch块的return语句。
- 只能执行一条return语句。
自定义异常
- 继承Exception 编译
- 继承RuntimeException 运行
注意事项:
- 子类重写父类方法时,子类的方法必须抛出相同的异常或者父类异常的子类。
- 父类抛出了多个异常,子类重写父类时 只能抛出相同的异常或者他的子集,子类不能抛出父类没有的异常
- 如果被重写的方法,没有异常抛出,那么子类的方法不可以抛出异常,如果有些子类有异常,则必须用try。。。catch处理。