當與含有在Java對象表達式處理我總是檢查它們是否null
在第一表達式和所&&
然後,以避免一個NullPointerException
表達式引用對象(例如obj.length()
),因爲&&
評估的左手側首先表達(或者我認爲?)。爲什麼這個表達式按照這個順序進行評估?
那麼,爲什麼當ArrayList
的長度爲2時,這個表達式給了我一個IndexOutOfBoundsException
?
ArrayList<String> tokens = new ArrayList<String>();
tokens.add("hello");
tokens.add("!");
System.out.println(tokens.size()); // 2
if(tokens.size() == 3 && tokens.get(0).equals("r") &&
(tokens.get(2).length() == 0) || tokens.get(2).equalsIgnoreCase("search")) {
System.out.println("hi");
}
它應該檢查大小肯定是3,因此它可以引用列表中的第3個對象。然而,它似乎是首先評估OR表達式,我認爲呢?
編輯:對我模糊的道歉。這裏假定ArrayList不是null。我使用的ArrayList爲null的例子僅用於說明目的。這裏實際發生的是ArrayList中的第3個對象在大小爲2時被訪問,儘管我有一個大小檢查作爲第一個表達式,導致IndexOutOfBoundsException
(null是大小爲2的ArrayList的第三個對象)
編輯2:更新了代碼以提供更好的示例。我期望代碼運行並且if語句失敗(是false)。不過,我得到了IndexOutOfBoundsException
編輯3:道歉一次,我得到了一個IndexOutOfBoundsException
不是NullPointerException
由於此代碼段是我無法表達分離出來,因爲我知道這的確會解決這個問題
有可能'tokens'爲空,或者包含null對象? – MeetTitan
Per @MeetTitan我建議添加'System.out.println(「tokens:」+ tokens);''''和'System.out.println(「tokens [0]:」+ tokens [0]);'if before your if '條款。另外,爲了加快速度,我會將每個條件作爲一個單獨的(嵌套的)子句來隔離它們。 – eebbesen
ArrayList絕對不包含空對象。絕對包含兩個實例化的對象,其大小爲2 :) – Rob