详细解读三种异常处理机制作用及用法
1.Trt…catch…用法
作用:负责某一部分的异常处理机制,发现异常给出提示。
语法:Try{可能出现异常区域}
catch(Exception e){异常提示,可以不写}
…
(catch可以有多个)
finally{资源清理,JDBC/IO}(可以不写)
异常结构:
Exception,Error是Throwable的子类
注:Exception:一般表示的是程序中出了问题,可以直接使用try…catch…处理,也可以写具体异常(如:NullPointerException,IndexOutOfBoundsException),写具体异常时,捕获到的是其他异常,控制台依然会显示异常抛出,并不再执行后面代码。
案例:
package com.jichu_07_yc;
public class Text {
public static void main(String[] args) {
int a=5/0; //出现异常的代码
System.out.println(a);
System.out.println("-----------------------");
System.out.println("你好!!");
}
}
执行结果:
加上try…catch…
package com.jichu_07_yc;
public class Text {
public static void main(String[] args) {
try {
int a=5/0; //异常出现代码
System.out.println(a);
} catch (Exception e) {
System.err.println("这里有异常!!!!");
}
System.out.println("你好!!");
}
}
运行结果:
分析:
没有加try…catch…时,代码运行到异常部分控制台显示异常抛出,不在运行后面代码;当加上try…catch…时,捕获到异常,并执行下一段代码。
(1) 注意:
Try里面的语句,在捕获到异常之后就不会在执行后面的代码,没有捕获到异常则继续执行。
package com.jichu_07_yc;
public class Text {
public static void main(String[] args) {
try {
System.out.println("开始");
int a=5/0; //出现异常的代码
System.out.println(a);
System.out.println("结束");
} catch (Exception e) {
System.err.println("这里有异常!!!!");
}
System.out.println("你好!!");
}
}
运行结果:
**并没有运行到“结束”这句代码
(2) 注意:
这里前一个异常不能比后一个异常的范围大,否则会报错
Finally块:
- 代码写在catch的后面
- 无论try捕获中,有没有出现异常,都必须执行finally块中的代码
- finally代码块,不是try catch异常捕获语句中必须出现的代码块
- finally块中,常用于资源回收的代码
如下图:
异常处理流程:
2.Throws用法:
作用:声明可能抛出的异常(并不一定会发生这些异常),在此方法中不做处理,而是将异常向上抛,交给它的调用者处理
语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{…}
案例:
package com.jichu_07_yc;
class Math{
public int div(int i,int j) throws Exception { //throws 向上抛出异常,让它的调用者处理
int add=i/j;
return add;
}
}
public class Text1{
public static void main(String[] args) {
Math math = new Math();
try {
System.out.println("结果为:"+math.div(5, 0)); //异常代码
} catch (Exception e) {
System.out.println("这里出现异常!!!!");
}
}
}
//------------------------------------------------------------------------------------------------
"""
*也可以继续上抛异常
"""
public class Text1{
public static void main(String[] args) throws Exception {
Math math = new Math();
System.out.println("结果为:"+math.div(5, 0)); //异常代码
}
}
//当主方法向上抛出异常时,只能将异常交给JVM进行处理了
当主方法向上抛出异常时,只能将异常交给JVM进行处理了
3.Throw用法:
与throws 关键字不同的是,可以直接使用throw关键字抛出一个异常。抛出时直接抛出异常类的实例化即可。
package com.jichu_07_yc;
public class Text2 {
public static void main(String[] args) {
try {
throw new Exception("抛出的异常"); //直接抛出异常的实例化对象即可
} catch (Exception e) {
System.out.println(e);
}
}
}
运行结果:
为什么要用throw抛出异常 :
异常产生时,系统会产生一个异常类的实例化对象,只是此时异常类的实例化对象是手工产生的。
由于很多时候用户定义了自己的异常类型,系统无法抛出的,这时就需要借助throw来抛出。
注:throw不会单独使用