具有多个 catch 语句的无法访问的代码
Unreachable code with multiple catch statements
为什么第 2 行可以编译而第 3 行不能?
spit() 抛出一个已在第 1 行捕获的 HurtException,因此之后出现的任何已检查异常都应该无法访问。如果我删除第 2 行,第 3 行将保持可达。异常不能免除编译时检查。预先感谢您为我澄清这一点。
public class Ape {
public void run() {
try {
spit();
} catch (HurtException e) { //line 1
System.out.println("f");
} catch (LimpException ex) { //line 2: Unreachable, HurtException already caught
System.out.println("e");
} catch (Exception ee) { //line 3: Compiles, why?
System.out.println("r");
}
}
public static void main(String[] args) {
new Ape().run();
}
public void spit() throws HurtException {
throw new HurtException();
}
class LimpException extends Exception {
}
class HurtException extends LimpException {
}
}
第 3 行编译,因为 Exception
是所有 RuntimeException 的超类,如果抛出此类异常,它将在 (catch Exception)
块的主体中处理(在运行时)。
编译器无法确定此类异常是否会在运行时抛出,因此不会将其标记为 unreachable
编译器只有 "knows" 关于 HurtException
可以从 spit()
抛出的,因为你明确地定义了它。将 LimpException
添加到方法签名的 throws
部分应该满足编译器:
public void spit() throws HurtException, LimpException {
throw new HurtException();
}
无论如何,如果该方法没有真正抛出 LimpException
本身,基本上只会让您的代码更难阅读。
为什么第 2 行可以编译而第 3 行不能? spit() 抛出一个已在第 1 行捕获的 HurtException,因此之后出现的任何已检查异常都应该无法访问。如果我删除第 2 行,第 3 行将保持可达。异常不能免除编译时检查。预先感谢您为我澄清这一点。
public class Ape {
public void run() {
try {
spit();
} catch (HurtException e) { //line 1
System.out.println("f");
} catch (LimpException ex) { //line 2: Unreachable, HurtException already caught
System.out.println("e");
} catch (Exception ee) { //line 3: Compiles, why?
System.out.println("r");
}
}
public static void main(String[] args) {
new Ape().run();
}
public void spit() throws HurtException {
throw new HurtException();
}
class LimpException extends Exception {
}
class HurtException extends LimpException {
}
}
第 3 行编译,因为 Exception
是所有 RuntimeException 的超类,如果抛出此类异常,它将在 (catch Exception)
块的主体中处理(在运行时)。
编译器无法确定此类异常是否会在运行时抛出,因此不会将其标记为 unreachable
编译器只有 "knows" 关于 HurtException
可以从 spit()
抛出的,因为你明确地定义了它。将 LimpException
添加到方法签名的 throws
部分应该满足编译器:
public void spit() throws HurtException, LimpException {
throw new HurtException();
}
无论如何,如果该方法没有真正抛出 LimpException
本身,基本上只会让您的代码更难阅读。