3 回答

TA贡献1862条经验 获得超7个赞
您应该遵循的基本思想是拥有这样的main方法:
public static void main(String... args) {
try {
new A().run();
} catch (ExitProgramException e) {
System.exit(e.getCode());
}
}
目前还没有预定义ExitProgramException。这很好,因为否则其他一些类可能已经抛出它。但是,在这种情况下,您希望定义可以引发此异常的所有位置。异常类应定义如下:
public final class ExitProgramException extends RuntimeException {
private final int code;
public ExitProgramException(int code) { this.code = code; }
public int getCode() { return code; }
}
现在,在 A 类和 B 类中,您可以throw new ExitProgramException(1),并且一切都会按预期工作。
由于extends RuntimeException,中间代码不必知道这个异常,并且会很高兴地让它冒泡,从类 B 到类 A 回到main方法,最终被捕获并转换为退出代码。

TA贡献1826条经验 获得超6个赞
一般来说,只有在以下情况下才值得捕获并重新抛出异常:
您将抛出不同类型的异常(更适合方法提供的抽象,通常包装原始异常),和/或
你想要一些副作用(例如在某处记录错误,或者一些不适合
finally { }
块的清理)。
如果你没有做任何这些,那么就选择简单的方法,不要捕获异常。但是请务必在方法的 JavaDoc 中提及它,即使它没有被选中。
正如其他人所说,返回专门的错误代码在 Java 中很少是一个好主意。它们罗嗦,容易忘记,并且不会传播给调用者。并且返回一个特殊值(例如null
)来代替正常的返回值更糟糕!例外是标准的方式,这是每个人都会期待的。

TA贡献1868条经验 获得超4个赞
Java 中的异常之处在于,它们在语义上做了很多不同的事情
代码错误:如 NullPointerException 或 SQLExceptions 等异常,您的 SQL 不正确。这些(IMO)不应该被捕获,或者应该作为错误重新抛出并在 uncaughtExceptionHandler (您可以在 Thread 中定义)中捕获
用户错误:NumberFormatException 等异常和错误表单数据异常,其中用户输入了无效值。这个(IMO)应该在他们应该更正值的地方附近有一条消息来处理
正常的、预期的异常:IOException / SocketException 等异常。InterruptedException 也在这个家族中。这些例外是你的朋友(!),因为他们解锁了正在等待他们应该等待的东西的线程。它们是连接到 IO 资源的正常周期的一部分。因此,如果套接字关闭,您可以在某处记录异常(有时甚至没有必要),并可能询问用户是否要重新打开连接。
添加回答
举报