假设我有以下内容:
class NegativeException extends RuntimeException {
}
class ZeroException extends NegativeException {
}
class Driver {
static boolean Marathon(int a) {
try {
if (a < 0)
throw new NegativeException();
else if (a == 0)
throw new ZeroException();
else if (a >= 42)
return true;
else
return false;
} catch (ZeroException e) {
System.out.println("Use natural number");
} finally {
System.out.println("One last thing");
}
System.out.println("All done.");
return false;
}
public static void main(String[] args) {
/* One last thing */
/* true */
System.out.println(Marathon(100));
System.out.println(Marathon(0));
System.out.println(Marathon(-5));
}
}
我想要了解的是为什么当使用main方法的第一行时,“All done”行没有被执行? Marathon(100)
似乎finally
语句执行,然后输出return
语句。我知道finally
块将始终执行,无论发生什么。但是,我似乎无法理解return语句如何影响try catch
块的流。尝试从try-cath-finally
块返回时是否有一组适用的规则?
答案 0 :(得分:4)
我想要了解的是为什么当使用main方法的第一行时,“All done”行没有被执行?马拉松(100)
因为a >= 42
为真,所以你这样做:
return true;
...立即将控制转移到finally
块;在finally
块的末尾,该函数返回(没有运行跟随<{em} finally
块的任何行)。也就是说,return
不仅设置返回值,而且在运行任何未完成的finally
块之后终止该点的函数。
如果你想继续执行,你会写一个变量,然后在最后有一个return
:
static boolean Marathon(int a) {
boolean rv = false;
try {
if (a < 0)
throw new NegativeException();
else if (a == 0)
throw new ZeroException();
else if (a >= 42)
rv = true;
} catch (ZeroException e) {
System.out.println("Use natural number");
} finally {
System.out.println("One last thing");
}
System.out.println("All done.");
return rv;
}
return
和try
内catch
的更多信息:如果您从return
内发出try
finally
块,它立即将控制转移到finally
块。当到达该块的末尾时,该函数终止(没有在 finally
块之后运行任何代码,除非您有嵌套的finally
块或类似的)。如果您return
内的catch
,则会发生同样的事情。
例如:
try {
if (someCondition) {
return 1;
}
if (someOtherCondition) {
throw new Exception();
}
}
catch (Exception e) {
System.out.println("Got here because of exception");
return 2;
}
finally {
System.out.println("Got here");
}
System.out.println("May not have gotten here");
return 3;
"Got here"
无论如何都会始终输出;这是finally
条款的重点,它们总是被执行。
"Got here because of exception"
为真时才输出 someOtherCondition
(并且将在"Got here"
之前输出),在这种情况下,函数通常返回值1
。< / p>
如果"May not have gotten here"
或someCondition
为真,则
someOtherCondition
将不会输出,因为return
和try
中的catch
s块。
如果两种情况都不属实,您会看到"May not have gotten here"
后跟"Got here"
,函数会返回3
。
请注意return
块中的catch
表示当2
为真时,函数返回正常(值为someOtherCondition
) ,它不扔。如果您没有return
且someOtherCondition
为真,则会看到"Got here because of exception"
和"Got here"
,然后该函数将以throw结束(否)完全返回值,并且不会输出"May not have gotten here"
。
最后但并非最不重要:如果return
块中有finally
,则return
“获胜”:即使您位于finally
区块内,你已经发出return
,在finally块中取代return
取代它,使函数返回finally
所说的值,而不是之前的值。