异常
* 程序的异常:Throwable
* 严重问题:Error (不处理!这种问题一般都是很严重的。)
* 问题:Exception
* 编译期问题:不是RunTimeException的异常 (必须进行处理的问题,因为不处理,编译不能通过)
* 运行期问题:RunTimeException (这种问题也不处理,这个问题出现是代码不够严谨,需要修正代码。)
对异常的处理:
JVM默认处理:
如果程序出现问题,我们没有做处理,最终JVM会做默认处理。把异常的名称,原因及出现的问题等信息输出在控制台。
同时会结束程序。
我们的处理:
A / try...catch ...finally
格式:
* try...catch...finally的处理格式:
* try{
* 可能出现问题的代码;
* }catch(异常名 变量) {
* 针对问题的处理;
* finally {
* 释放资源;
* }
*
* 变形格式:
* try{
* 可能出现问题的代码;
* }catch(异常名 变量){
* 针对问题的处理;
* }
注意:
try里面的代码越少越好。
catch必须有内容,哪怕是给出一个简单的提示。才有意义。才没有隐藏异常。
范例:
public class ExceptionDemo {
public static void main(String[] args) {
//第一阶段
int a = 10;
int b = 0;
// System.out.println(a/b);
try {
System.out.println(a/b);
} catch (ArithmeticException ae){
System.out.println("除数不能为0");
}
//第二阶段
System.out.println("over");
}
}
/*返回结果:
除数不能为0
over*/
多个异常处理的格式:
* 多个异常处理的格式:
* try {
* ...
* } catch(异常名 变量名) {
* ...
* }
* catch(异常名 变量名){
* ...
* }
* ...
* 注意:一旦try里面出了问题,就会在这里吧问题抛出去,然后和catch里面的问题进行匹配,
* 一旦有匹配的,就执行catch里面的处理,然后结束。
* 继续执行后面的语句。
编译时期异常和运行时期异常的区别:
编译期异常:java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行期异常:无需显示处理,也可以和编译时异常一样处理
在try里面发现问题后,jvm会生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。
如果该对象是某个类型的,就会执行该catch里面的处理。
异常中要了解的方法:
public String getMessage() //异常的消息串
public String toString() //返回异常的简单信息描述
thorws 异常处理方式
无法处理或者不处理的异常,为了解决出错问题,采用throws抛出。
在方法声明上抛出,是为了告诉调用者注意会发生问题。
格式:
throws 异常类名
注意:这个格式必须跟在方法的括号后面
**注意:尽量不要在main方法上抛出异常。
编译期异常的抛出在运行期必须处理!
throw 异常处理方式:
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
这个时候抛出的是异常的对象,而不是异常类。
throw 和 throws的区别:
throws
用着方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
表示出现异常的一种可能性,并不一定会发生这些异常。
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
执行throw则一定抛出了某种异常
异常处理的原则:
该功能内部可以将问题处理,用try
如果处理不了,交由调用者处理,用throws
区别:
后续程序需要继续运行用try
后续程序不需要继续运行就用throws
finally关键字
格式:try...catch...finally...
特点:
被finally控制的语句体一定会被执行
作用:用于释放资源
——————————————————————————————————————
自定义异常
在实际的开发中,需要自己定义异常,且比较继承Exceptin或者RunTimeException。
继承Exception
继承RunTimeException
范例:
public class MyException extends Exception {
}