3 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
就個(gè)人而言,我認(rèn)為這是按慣例支持的,EAFP絕不是一個(gè)好方法。您可以將其視為等同于以下內(nèi)容:
if (o != null)
o.doSomething();
else
// handle
相對(duì)于:
try {
o.doSomething()
}
catch (NullPointerException npe) {
// handle
}
此外,請(qǐng)考慮以下事項(xiàng):
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
這看起來可能不太優(yōu)雅(是的,這是一個(gè)粗糙的示例-忍受),但是與處理所有錯(cuò)誤相比,它為您提供了更大的粒度來處理錯(cuò)誤,然后將其包裝在try-catch中以獲取該錯(cuò)誤NullPointerException,然后嘗試弄清楚在哪里以及為什么得到它。
我看待它的方式EAFP絕不應(yīng)該使用,除非極少數(shù)情況。另外,由于您提出了問題:是的,即使未引發(fā)異常,try-catch塊也確實(shí)會(huì)產(chǎn)生一些開銷。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
除了Python和Java中異常的相對(duì)代價(jià)外,請(qǐng)記住,它們之間在哲學(xué)/態(tài)度上存在差異。Java試圖對(duì)類型(以及其他所有類型)非常嚴(yán)格,要求對(duì)類/方法簽名進(jìn)行明確,詳細(xì)的聲明。它假定您在任何時(shí)候都應(yīng)該確切地知道您正在使用什么類型的對(duì)象以及它能夠做什么。相反,Python的“鴨子類型”意味著您不確定(也不應(yīng)該在意)對(duì)象的清單類型是什么,只需要在請(qǐng)求時(shí)就注意它會(huì)嘎嘎作響。在這種寬容的環(huán)境中,唯一理智的態(tài)度是假定事情會(huì)成功,但如果事情沒有后果,則要做好應(yīng)對(duì)的準(zhǔn)備。Java的自然限制 非常適合這種隨意的方法。(這并不是要貶低方法或語言,而是要說這些態(tài)度是每種語言習(xí)語的一部分,并且在不同語言之間復(fù)制習(xí)語通常會(huì)導(dǎo)致尷尬和溝通不暢。)
添加回答
舉報(bào)