这里我有一个预期返回布尔值的方法:
static boolean display()
{
}
编译失败,因为此方法必须返回布尔类型的结果。
但是,如果修改方法如下:
static boolean display()
{
try{
throw new ArithmeticException();
}
catch(ArithmeticException e)
{
throw e;
}
finally
{
System.out.println(finally);
}
}
即使我没有添加任何return语句,为什么编译不会再失败?
如果在catch块中我不包含throw语句,则由于先前的原因,编译将再次失败。
答案 0 :(得分:2)
Java编译器进行(有限的)流分析,当它可以确定所有控制流导致异常时,就不需要返回。
答案 1 :(得分:0)
要了解,请尝试将return true;
放在方法的末尾。然后,您将收到错误消息,调用不可达语句。
发生这种情况是因为您的方法总是引发异常。因此,最后您不需要返回值,因为它已经在此之前引发了异常并结束了方法
答案 2 :(得分:0)
您:即使我没有添加任何return语句,为什么编译仍不会失败?
答案:当您在try块中明确抛出异常时,再次 在catch块中,您显式抛出异常,编译器 不会引发错误,因为您引发了异常 明确地使用throw关键字,该关键字会突然终止 正常的代码流,并停止执行所有后续代码 在显示方法和控件中直接转移到调用方 方法
public class StackOverFlowReturn {
public static void main(String[] args) {
try {
System.out.println(display());
} catch (Exception ae) {
System.out.println("Arithmetic Exception");
}
}
static boolean display() {
try {
throw new ArithmeticException();
} catch (ArithmeticException e) {
throw e;
} finally {
System.out.println("finally");
}
}
}
输出:
最终
算术异常
在catch块中,如果您代码返回而不是显式抛出 那么
public class StackOverFlowReturn {
public static void main(String[] args) {
try {
System.out.println(display());
} catch (Exception ae) {
System.out.println("Arithmetic Exception");
}
}
static boolean display() {
try {
throw new ArithmeticException();
} catch (ArithmeticException e) {
return true;
} finally {
System.out.println("finally");
}
}
}
输出:
最终
true
您:如果我在catch块中未包含throw语句,则由于先前的原因,编译将再次失败。
答案:当您在try块中明确抛出异常时,它 没有必要在catch块中有明确的抛出。您可以 代码如下:
public class StackOverFlowReturn {
public static void main(String[] args) {
System.out.println(display());
}
static boolean display() {
try {
throw new ArithmeticException();
} catch (ArithmeticException e) {
System.out.println("Arithmetic Exception");
} finally {
System.out.println("finally");
}
return true;
}
}
输出:
算术异常
最终
true