一看到异常就崩溃的应用程序是非常糟糕的做法,特别是当有一些工作尚未保存且应用程序正在使用需要在应用程序终止执行之前被释放和清理的一些资源时。一些非常受欢迎的软件曾经这样做...但是他们只是在应用程序重新启动时引入了数据可恢复性功能,而没有“修复”问题。然而,无论如何,这都不是良好的软件工程。
至少,你的应用程序不应该在第一个遇到的异常/错误上崩溃,而应该用有意义的消息恢复。将所有东西都包装在一个 RuntimeException(或者甚至 Throwable)中并且什么也不做是懒惰的行为。
Java不支持任何类型的标志,因为有1)解决方法,2)更好的处理此情况的方法。例如:
1. 在调用方法中处理异常
您可以在方法声明中添加 throws 关键字,直到您的 static public void main 方法,如果不处理异常,最终会通过堆栈跟踪崩溃应用程序。
class Foo {
public void someMethod(....) throws IllegalArgumentException, IOException {
...
}
static public void main(String...args) throws Throwable {
new Foo().someMethod();
}
}
这种方法没有提供任何可恢复性的手段,可能会让用户感到不满(如果他们从控制台运行应用程序,则出现无意义的大堆栈跟踪,如果他们从快捷方式或GUI启动,则什么也没有)。此外,如果您拥有一些已获取的资源,当异常发生时将无法清理它们。至少,您的 main
应该 catch (Throwable e)
并在抛出上述异常之前输出一些内容。例如:
class Foo {
public void someMethod(....) throws IllegalArgumentException, IOException {
...
}
static public void main(String...args) {
try {
new Foo().someMethod();
} catch (...) {
}
}
}
**编辑**
考虑这种情况:一个程序正在初始化一些资源以处理一些数据,然后在处理过程中发生了运行时异常(或错误),应用程序崩溃,但是资源没有被释放或释放。然而,在Java中,可以这样做:
public E doSomething() throws RuntimeException {
try {
} finally {
}
}
在错误或成功时,可以干净地退出方法,甚至为了“纪念”记录运行时错误。
2. 记录错误并返回有意义的值
记录日志是一种非常好的实践。您可以向用户显示一些消息,告诉他们操作无法执行而不会崩溃整个系统,并提供一些跟踪信息,以了解用户正在进行什么操作和位置。简单的日志记录系统可能如下:
class Foo {
static private final Logger LOG = Logger.getLogger(Foo.class.getName());
public boolean doSomethingImpl(...) {
boolean result = true;
try {
...
} catch (SomeException e) {
LOG.log(Level.SEVERE, "meaningful message why method could not do something!", e);
result = false;
}
return result;
}
public void doSomething() {
if (!doSomethingImpl(...)) {
}
}
}
默认情况下,Logger
会将所有内容输出到 err
输出流中,但是您可以添加自己的处理程序:
// loggers are singletons, so you can retrieve any logger at anytime from
// anywhere, as long as you know the logger's name
Logger logger = Logger.getLogger(Foo.class.getName());
logger.setUseParentHandlers(false); // disable output to err
logger.addHandler(new MyHandler()); // MyHandler extends java.util.logging.Handler
Java已经内置了一些默认的日志处理程序,其中之一写入文件。
等等。
IOUtils.closeQuietly
但用于连接的closeQuietly
方法。 - MeBigFatGuy