3 回答
TA贡献1817条经验 获得超14个赞
就个人而言,我认为这是按惯例支持的,EAFP绝不是一个好方法。您可以将其视为等同于以下内容:
if (o != null)
o.doSomething();
else
// handle
相对于:
try {
o.doSomething()
}
catch (NullPointerException npe) {
// handle
}
此外,请考虑以下事项:
if (a != null)
if (b != null)
if (c != null)
a.getB().getC().doSomething();
else
// handle c null
else
// handle b null
else
// handle a null
这看起来可能不太优雅(是的,这是一个粗糙的示例-忍受),但是与处理所有错误相比,它为您提供了更大的粒度来处理错误,然后将其包装在try-catch中以获取该错误NullPointerException,然后尝试弄清楚在哪里以及为什么得到它。
我看待它的方式EAFP绝不应该使用,除非极少数情况。另外,由于您提出了问题:是的,即使未引发异常,try-catch块也确实会产生一些开销。
TA贡献1848条经验 获得超2个赞
除了Python和Java中异常的相对代价外,请记住,它们之间在哲学/态度上存在差异。Java试图对类型(以及其他所有类型)非常严格,要求对类/方法签名进行明确,详细的声明。它假定您在任何时候都应该确切地知道您正在使用什么类型的对象以及它能够做什么。相反,Python的“鸭子类型”意味着您不确定(也不应该在意)对象的清单类型是什么,只需要在请求时就注意它会嘎嘎作响。在这种宽容的环境中,唯一理智的态度是假定事情会成功,但如果事情没有后果,则要做好应对的准备。Java的自然限制 非常适合这种随意的方法。(这并不是要贬低方法或语言,而是要说这些态度是每种语言习语的一部分,并且在不同语言之间复制习语通常会导致尴尬和沟通不畅。)
添加回答
举报