3 回答

TA貢獻1798條經驗 獲得超7個贊
解釋
您正在使用增強的 for 循環:
for (final Map<String, Object> candidate : candidateList) {
...
}
編譯器將其替換為與以下源代碼等效的字節碼:
Iterator<Map<String, Object>> elementIter = candidateList.iterator();
while (elementIter.hasNext()) {
final Map<String, Object> candidate = elementIter.next();
...
}
如果不再有下一個元素,雖然elementIter.next()確實會拋出 a NoSuchElementException(請參閱文檔),但首先檢查循環條件:
while (elementIter.hasNext()) {
并在您的情況下Iterator#hasNext返回false。請參閱文檔:
true如果迭代有更多元素,則返回。(換句話說,return trueifnext()會返回一個元素而不是拋出異常。)
所以你的循環永遠不會進入。這也是為什么您不會看到循環設計者所希望的任何異常的原因。
與常規循環的比較
為了進行比較,讓我們嘗試使用常規循環迭代一個空數組:
int[] values = new int[0];
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
代碼運行良好,沒有任何異常,原因與之前相同。條件解決為
i < 0
對于第一次迭代 ( i = 0),這已經是錯誤的。所以永遠不會進入循環。
這意味著增強的 for 循環的行為與常規循環的此示例相同。

TA貢獻1794條經驗 獲得超8個贊
庫設計者決定不拋出異常,因為他們認為這將使使用庫的代碼更干凈。如果它確實拋出了一個異常,你必須每次都檢查集合是否為空,而不是僅僅迭代它并依賴于什么都不發生。
設計師在不同的情況下做出了不同的決定。例如,Iterables.find(iterable, predicate)
如果不存在與謂詞匹配的元素,當它可能剛剛返回null
等時,Guava 會拋出異常。
用于決定是否拋出異常的經驗法則是:如果使用參數的調用很可能是由錯誤進行的,或者可能會產生難以調試的錯誤,則拋出異常。否則做一些明智的事情(比如返回null
,無操作等)
因此,嘗試迭代一個空集合被認為不太可能是錯誤的,而嘗試查找集合中不存在的元素被認為可能是意外的,從而導致異常。但這些并不是硬性規定,視角因語言而異,因設計者而異,因情況而異。

TA貢獻1796條經驗 獲得超10個贊
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!!!");
}
}
}
它永遠不會進入你的循環,所以它不會拋出任何異常。
如果您將空元素添加到您的列表中。它會拋出錯誤
添加回答
舉報