什么是Java的异常体系?参考博客:Java基础——运行时异常和非运行时异常
throw
是Java中的一个关键字,可以在方法上声明抛出一个异常,如果方法体中发生了异常,那么方法会通过throw
关键字将异常抛出。throw
或者try{}catch{}
。throw
关键字将异常声明抛出之外,还可以使用try{}catch{}
的方式将异常捕获。throw
进行抛出,要么就使用try{}catch{}
进行异常的捕获。try {
System.out.println("代码正常执行......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}
正常情况下,以上代码的执行结果是:
代码正常执行......
return
之外),而是执行catch{}中的代码。try {
System.out.println("代码正常执行......");
int i = 1/0;
System.out.println("代码发生异常了......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}
发生异常的情况下,以上代码的执行结果是:
代码正常执行......
代码发生异常后执行......
finally
是try{}catch{}
体系中的一部分,全部代码书写为try{}catch{}finally{}
。正常情况
try {
System.out.println("代码正常执行......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}finally {
System.out.println("finally代码块中的代码一定会执行......");
}
正常情况下,以上代码的执行结果是:
代码正常执行......
finally代码块中的代码一定会执行......
发生异常
try {
System.out.println("代码正常执行......");
int i = 1/0;
System.out.println("代码发生异常了......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}finally {
System.out.println("finally代码块中的代码一定会执行......");
}
发生异常的情况下,以上代码的执行结果是:
代码正常执行......
代码发生异常后执行......
finally代码块中的代码一定会执行......
以上的情况都是方法是无返回值的情况,如果方法是有返回值的,并且在try{}catch{}finally{}中都有return,那么方法该return那个返回值呢?
在探索try{}catch{}finally{}
中return
的时机之前,我们先根据return的位置,定义一下return
的类型。
private static String test() {
String str = "start";
try {
return str = "try ruturn"; //这里定义为正常return
} catch (Exception e) {
return str = "catch ruturn"; //这里定义为异常return
}finally {
return str = "finally ruturn"; //这里定义为最终return
}
return "method return"; //这里定义为方法return
}
最终return
和方法return
是互斥的,即在一个方法中,最终return
和方法return
只能写一个,否则编译无法通过(或者IDE会报错)。正常return
和异常return
都有的时候,最终return
可有可无,但是方法return
一定不能有,否则报错。最终return
的时候,正常return
和异常return
可有可无。最终return
的时候,要么一定要有正常return
和异常return
,要么一定要有方法return
。当方法中return的时候,那么try{}catch{}finally{}
中的代码顺序又该怎么执行呢?
首先,我们来看一下代码:
public static void main(String[] args) {
System.out.println("main:"+test());
}
private static String test() {
String str = "start";
try {
System.out.println("try:" + str);
System.out.println("try is running......");
return str = str + "->try return";
} catch (Exception e) {
System.out.println("catch:" + str);
System.out.println("catch is running......");
return str = str + "->catch return";
}finally {
System.out.println("finally:" + str);
str = "finally:" + str;
System.out.println("finally is running......");
return str = "->finally return";
}
}
该段代码的执行结果是:
try:start
try is running......
finally:start->try return #这里是System.out.println("finally:" + str);的输出结果,我们发现str变成了start->try return
finally is running......
main:->finally return
如果我们去掉finally中的return的话:
public static void main(String[] args) {
System.out.println("main:"+test());
}
private static String test() {
String str = "start";
try {
System.out.println("try:" + str);
System.out.println("try is running......");
return str = str + "->try return";
} catch (Exception e) {
System.out.println("catch:" + str);
System.out.println("catch is running......");
return str = str + "->catch return";
}finally {
System.out.println("finally:" + str);
str = "finally:" + str;
System.out.println("finally is running......");
}
}
执行结果为:
try:start
try is running......
finally:start->try return #这里是System.out.println("finally:" + str);的输出结果,我们发现str变成了start->try return
finally is running......
main:start->try return #这里执行了finally的代码,但是return的结果依然是try中的返回结果。