java version "1.7.0_75"
您好,
只是想知道比较下面两个函数的首选最佳做法是什么。
第一个抛出应该在调用函数中捕获的NullPointerException。 如果存在空指针异常,则第二个返回false。
抛出异常:
public void disconnect() throws NullPointerException {
if(mClientConnection == null) {
throw new NullPointerException("mClientConnection has an invalid reference");
}
if(mClientConnection.isConnected()) {
mClientConnection.disconnect();
}
mClientConnection = null;
}
只返回true或false:
public boolean disconnect() {
if(mClientConnection == null) {
log.log(Level.SEVERE, "Cannot disconnect as mClientConnection is null");
return false;
}
if(mClientConnection.isConnected()) {
mClientConnection.disconnect();
}
mClientConnection = null;
return true;
}
通常在过去,我总是选择第二个,只返回true或false。但现在我只是在寻找替代解决方案。
非常感谢任何建议,
答案 0 :(得分:4)
如果您编写其他开发人员将使用的API - 更好地采用第二种方法,那么从"客户"处理起来会更容易(也更清洁)。侧:
while (!disconnected()) {
// do something else
// sleep and try again
// etc
}
一般情况下 - 不要抛出你知道如何优雅处理的异常!
答案 1 :(得分:2)
他们都不是。
我会抛出自定义Exception
,甚至不是RuntimeException
。
如果您因任何原因确实需要该布尔值,请返回true
如果成功,即使mClientConnection
为null
,该方法也会按预期执行。
答案 2 :(得分:2)
假设您希望在大多数情况下找到一个值,那么抛出异常会更好,如果它为null。例外意味着存在问题。
如果该值可能丢失或存在且两者都对应用程序逻辑有效,或者有其他人要使用您的API,则返回false。
同样重要性也很重要,因此请与您在其他地方的工作保持同步
答案 3 :(得分:2)
通常,返回一个值比抛出异常要快得多,因为异常需要反射并需要一些时间来构建异常数据。
但是根据你的项目设计,抛出异常可能是正确的选择,因为调用没有连接的方法可以被视为异常情况。
答案 4 :(得分:1)
在这个具体案例中,我认为你们不应该这样做。如果你告诉你的对象断开连接并且它已经断开连接(即它已经为空),那就不要做任何事情了。
答案 5 :(得分:1)
如果连接已经为空,则您的工作已完成,理想情况下您不需要将其标记为失败。您只需记录低严重性消息即可。这实际上取决于断开连接后您的操作以及是否使用断开连接尝试的实际结果
答案 6 :(得分:1)
除了这里的众多答案之外,我还想补充说,抛出例外是代价。尽管Java VM多年来已经有了很大的改进,但这个成本可以忽略不计,但它仍然可能是您想要优化的。
我将引用关于抛出异常和创建的性能分析的成本的另一个相关的SO问题。 these answers are more thorough比我在这里写的关于Java的具体内容的文章。
简而言之,抛出异常代价很高,主要是因为机器必须从堆栈跟踪中展开,并且有关堆栈跟踪的信息将始终被记录,即使它未被使用,破坏了逻辑的流动。一个基本原则是将可能抛出异常的函数放在try-catch块中,以便程序知道如何处理自身而不是崩溃。 (用户根本不想看到例外情况。)
话虽如此,如果您可以选择不抛出异常,请不要这样做,以提高性能。这也符合史蒂夫麦康奈尔在Code Complete book中的例外原则,即仅在异常情况下抛出异常。
对于断开连接函数的这种特殊情况,如果您觉得null
值不是经常发生的事情,那么抛出异常。但是,如果它是经常发生的事情(比如说用户没有在字段中输入值,不希望例外),返回false,甚至在同一方法中处理案例,毕竟该函数用于断开某些东西,它应该能够为经常发生的所有情况(已经断开连接,连接死机,服务器没有回复等)执行此操作,并且仅针对特定情况的例外,例如程序的2个实例运行,竞赛条件等。