第4章:如何编写自己的异常?
现在,我们已经知道了如何使用提供的异常以及其中一些最常见的异常。 但是,试想一下,您想抛出一个异常,该异常与预定义的任何异常都不适合吗?
例:
您已经编写了自己的文字冒险记录(是的,它们是老式的,但是仍然存在),并且您想在命令有效但在这种情况下不能使用时抛出异常(例如,“看着门”天黑的时候)。
您可以在此处使用if语句,但在这种情况下,我们只选择使用Exceptions。
您现在想要的是
ActionNotPossibleNowException 。 您想告诉它,什么不能做以及为什么不能完成,它应该为您提供输出,其中涵盖了两者。可以这样编码:
public class ActionNotPossibleNowException extends Exception {
public ActionNotPossibleNowException(String action, String reason)
{
super("Could not " + action + " now. Reason: " + reason);
}
}
如您所见,它与任何其他超类关系都没有任何不同。
我们所需要知道的是, Exception有一个构造函数,该构造函数将String作为参数,而此String是错误消息。
所以,现在你可以有一个方法
您的角色类中的lookAt如下所示:
public class Character {
private boolean lightIsOn = true;
...
public void lookAt(String target) throws ActionNotPossibleNowException
{
if(!lightIsOn) throw new ActionNotPossibleNowException("look at " + target, "It is dark.");
else
{
...
}
}
}
当然,您也可以扩展任何其他给定的Exception-如果您决定ActionNotPossibleNowException实际上是Input-Output-Exception(IOException),只需将代码更改为
public class ActionNotPossibleNowException extends IOException {
public ActionNotPossibleNowException(String action, String reason)
{
super("Could not " + action + " now. Reason: " + reason);
}
}
现在可以捕获以下任何一行:
catch(ActionNotPossibleNowException anpne){...}
catch(IOException ioe){...}
catch(Exception e){...}
通常,您不应该直接扩展Exception,而应该扩展更专门的Exception。
例如
class NoKeyPressedException extends IOException {
// ...
}
和
class NoMouseButtonPressedException extends IOException {
// ...
}
都会被抓住
catch(IOException ioe) {
//...
}
而且您仍然可以有第三个例外
class ThirdException extends Exception {
//...
}
不会被该捕获块捕获,可以单独处理。
您可以不同地解决此问题,但这是一种简单而充分的方法。
返回第3章或继续第5章
From: https://bytes.com/topic/java/insights/750358-introduction-exceptions-ch-4-a