我正在使用Java应用程序,并且看到在许多地方都可以处理运行时异常。例如,
try {
// do something
} catch(NullPointerException e) {
return null;
}
我的问题是,什么时候可以处理运行时异常?什么时候应该处理异常?
我正在使用Java应用程序,并且看到在许多地方都可以处理运行时异常。例如,
try {
// do something
} catch(NullPointerException e) {
return null;
}
我的问题是,什么时候可以处理运行时异常?什么时候应该处理异常?
Answers:
这取决于。
例如,如果无法解析提供的字符串,则Integer#parseInt
抛出NumberFormatException
(RTE)。但是,您肯定不希望仅因为用户在用于整数的文本字段中输入“ x”而导致应用程序崩溃了吗?以及如何知道是否可以解析该字符串,除非您先尝试解析它?因此,在这种情况下,RTE只是一个错误信号,应该引起某种错误消息。有人可能会争辩说这应该是一个检查过的异常,但是您可以做什么-事实并非如此。
Integer#parseInt
应该真正返回Maybe<Integer>
而不是完全不抛出任何异常。
NullPointerExceptions通常是缺少空检查的标志。因此,与其像这样捕获它,不如添加适当的null检查以确保不会引发异常。
但是有时,处理RunTimeExceptions是适当的。例如,当您不能修改代码以在适当的位置添加空检查时,或者当异常不是NullPointerException时。
您处理异常的示例非常糟糕。这样做会丢失堆栈跟踪和有关该问题的精确信息。而且您实际上并没有解决它,因为您可能会在其他地方触发另一个NullPointerException,并获得有关发生的情况以及如何解决它的误导性信息。
return null;
)将是一个更好的解决方案。
new
抛出std::bad_alloc
C ++。
例外应该就是..例外。使用异常的最佳实践是使用它们来覆盖发生与您预期会发生的事情相反的情况。经典示例是FileNotFoundException,当文件根本不存在时会抛出该异常。如果要测试文件的存在性,则可以使用File.exists(),因为您只是用10英尺长的棍棒试探一下是否撞到了东西。
从技术上讲,您可以将其放在try catch中并使用该文件,就可以达到相同的结果,但是A)例外通常在资源上是昂贵的,B)程序员将假设您的意思是该文件存在(如果存在)尝试捕获,这增加了程序的整体混乱。
在很多情况下,我都会编写一个从数据库中获取一些值的方法。一千种方法可能会出错,并且看到我只需要一小部分信息,就很难用包含5种不同异常的try catch列表来包围该呼叫。因此,我将在fetch方法中捕获异常。如果出了问题,我将采取一切适当的措施来关闭数据库连接,或者在finally子句中关闭what,然后返回null。这是一个好习惯,不仅因为它简化了代码,而且因为“ null”发送的消息与您可能从异常中得到的信息相同。在提取方法中管理异常细节,但在事情不正常时管理该怎么办
例如:
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}