Java中异常处理的两种方式

Java中异常处理的两种方式

try-catch-finally

  • 程序员在代码中国捕获发生的异常,自行处理

try{

可能发生异常的代码块}catch(Exception e){

系统将其封装成Exception对象 ,传递给catch。也可以在这里增加自己的业务逻辑

}finally{

不管是否有异常发生,finally代码块一定会执行

}

注意事项:

如果在try中发生异常了,则其后面的语句不会执行,直接进入catch中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Learn;
public class Test {
public static void main(String[] args) {
String name="鲁迅";
try{
int num=Integer.parseInt(name);
System.out.println("我又没有输出");
}
catch (Exception e){
System.out.println("发生异常了");
}finally {
System.out.println("运行结束");
}
}
}

image-20220704161623702try{}finaly{}也可以直接使用,但是程序会崩溃。并且finaly中语句会执行,但是其后面的程序并不会执行。

throws处理机制

我们假设jvm虚拟机调用main方法,而main方法调用了f1方法,f1调用f2方法。如果f2方法有异常,那么在f2中可以用try-catch方法自己处理,也可以throws抛出给f1方法,同理f1也可以做出相同的操作,而方法如果一直往上抛出,最终给到了jvm虚拟机会直接打印出来异常信息,进而中断程序。

在Java中,如果我们没有用操作区管理异常,则默认会一直向上抛出,直到jvm,在下面中我们可以看到f1中存在的异常抛出给了main方法,main方法捕捉并且进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Learn;
public class Test {
public static void main(String[] args) {
AA aa = new AA();
try {
aa.f1();
}catch (ArithmeticException arithmeticException){
System.out.println("有错误");
}

}
}
class AA{
public void f1() throws ArithmeticException {
int a=10/0;
}
}

image-20220704161713266细节问题

对于问题中的编译异常必须进行处理,而运行异常则有默认的处理机制

对于子类重写父类方法时,子类抛出的异常必须是父类异常的子类型或者相同

1
2
3
4
5
6
7
8
9
10
11
class AA{
public void f1() throws Exception {
int a=10/0;
}
}
class BB extends AA{
@Override
public void f1() throws ArithmeticException{

}
}

点击并拖拽以移动