第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么在 Java 中迭代 Empty Map 不會(huì)引發(fā)任何異常

為什么在 Java 中迭代 Empty Map 不會(huì)引發(fā)任何異常

素胚勾勒不出你 2021-11-17 14:59:27
我遇到了下面的代碼,我希望 Java 能夠通過異常,因?yàn)槲艺诘?List 是空的。public static void main(String[] args) {   final List<Map<String, Object>> candidateList = new ArrayList<>();    for (final Map<String, Object> candidate : candidateList) {        if (candidate.isEmpty()) {            System.out.println("Empty!!!");        }    }}但是代碼執(zhí)行時(shí)沒有拋出任何錯(cuò)誤或異常。
查看完整描述

3 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

解釋

您正在使用增強(qiáng)的 for 循環(huán):


for (final Map<String, Object> candidate : candidateList) {

    ...

}

編譯器將其替換為與以下源代碼等效的字節(jié)碼:


Iterator<Map<String, Object>> elementIter = candidateList.iterator();

while (elementIter.hasNext()) {

    final Map<String, Object> candidate = elementIter.next();

    ...

}

如果不再有下一個(gè)元素,雖然elementIter.next()確實(shí)會(huì)拋出 a NoSuchElementException(請參閱文檔),但首先檢查循環(huán)條件:


while (elementIter.hasNext()) {

并在您的情況下Iterator#hasNext返回false。請參閱文檔:


true如果迭代有更多元素,則返回。(換句話說,return trueifnext()會(huì)返回一個(gè)元素而不是拋出異常。)


所以你的循環(huán)永遠(yuǎn)不會(huì)進(jìn)入。這也是為什么您不會(huì)看到循環(huán)設(shè)計(jì)者所希望的任何異常的原因。


與常規(guī)循環(huán)的比較

為了進(jìn)行比較,讓我們嘗試使用常規(guī)循環(huán)迭代一個(gè)空數(shù)組:


int[] values = new int[0];


for (int i = 0; i < values.length; i++) {

    System.out.println(values[i]);

}

代碼運(yùn)行良好,沒有任何異常,原因與之前相同。條件解決為


i < 0

對(duì)于第一次迭代 ( i = 0),這已經(jīng)是錯(cuò)誤的。所以永遠(yuǎn)不會(huì)進(jìn)入循環(huán)。


這意味著增強(qiáng)的 for 循環(huán)的行為與常規(guī)循環(huán)的此示例相同。


查看完整回答
反對(duì) 回復(fù) 2021-11-17
?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

庫設(shè)計(jì)者決定不拋出異常,因?yàn)樗麄冋J(rèn)為這將使使用庫的代碼更干凈。如果它確實(shí)拋出了一個(gè)異常,你必須每次都檢查集合是否為空,而不是僅僅迭代它并依賴于什么都不發(fā)生。

設(shè)計(jì)師在不同的情況下做出了不同的決定。例如,Iterables.find(iterable, predicate)如果不存在與謂詞匹配的元素,當(dāng)它可能剛剛返回null等時(shí),Guava 會(huì)拋出異常。

用于決定是否拋出異常的經(jīng)驗(yàn)法則是:如果使用參數(shù)的調(diào)用很可能是由錯(cuò)誤進(jìn)行的,或者可能會(huì)產(chǎn)生難以調(diào)試的錯(cuò)誤,則拋出異常。否則做一些明智的事情(比如返回null,無操作等)

因此,嘗試迭代一個(gè)空集合被認(rèn)為不太可能是錯(cuò)誤的,而嘗試查找集合中不存在的元素被認(rèn)為可能是意外的,從而導(dǎo)致異常。但這些并不是硬性規(guī)定,視角因語言而異,因設(shè)計(jì)者而異,因情況而異。


查看完整回答
反對(duì) 回復(fù) 2021-11-17
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

public static void main(String[] args) {

   final List<Map<String, Object>> candidateList = new ArrayList<>();

    for (final Map<String, Object> candidate : candidateList) {

        //because all below code will never execute

        if (candidate.isEmpty()) {

            System.out.println("Empty!!!");

        }

    }

}

它永遠(yuǎn)不會(huì)進(jìn)入你的循環(huán),所以它不會(huì)拋出任何異常。


如果您將空元素添加到您的列表中。它會(huì)拋出錯(cuò)誤


查看完整回答
反對(duì) 回復(fù) 2021-11-17
  • 3 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)