问题出在这里 .
private static void EagleLanding () {
EagleLandingException("There is a problem with the Eagle!");
System.exit(9999);
}
EagleLandingException(...) 被解释为对名为 EagleLandingException 的方法的调用 . 但这不是一种方法 . 它是一个构造函数,它的名称(类名)不在Java查找方法名称的命名空间中 . 编译错误(实际上)说“我找不到 method 被叫......” .
另一个问题是您的 EagleLanding 方法未声明为抛出异常 . 因此,当您尝试在调用者中捕获异常时,编译器会说"this is a checked exception, and since the exception is not declared as thrown, it cannot occur here" . 因此编译错误 .
写这个的正确方法是:
private static void eagleLanding () throws EagleLandingException {
throw new EagleLandingException("There is a problem with the Eagle!");
}
笔记:
new 导致创建异常对象
throw 导致抛出异常 .
throws 子句声明该方法抛出已检查的异常 .
throw 之后的语句无法访问 . 如果不删除它们,则会出现编译错误 . (并且,除了在类似的方法中调用 exit 这是一个坏主意......)
我更改了方法名称以符合Java样式规则 . 方法应以小写名称开头 .
在他的回答中,@ javaguy建议不要检查 EagleLandingException ;即声明为 RuntimeException 的子类型 .
这是正确的吗?可能是,可能不是 . 在你给我们的(高度人为的)背景中,不可能确切地知道 .
但是,Java设计人员建议开发人员应遵循以下一些通用准则:
经过检查的异常适用于可能针对异常进行某些操作的预期事件 .
未经检查的异常适用于意外事件(例如错误),其中(通常)程序员可以做的事情并不多 .
人们在决定是否使用已检查或未检查的异常时使用的另一个标准是最小化样板代码的数量;即 throws 条款 . 很多人发现它们很烦人,并会花很多时间来避免它们;例如通过将所有自定义异常声明为未选中,将自定义异常中的标准异常包装起来,等等 .
我认为最佳途径介于两者之间 . 仔细考虑将每个异常声明为已选中或未选中的含义,并使用异常层次结构来管理 throws 声明的大小 .