2013-10-23 88 views
1

這就是我爲編碼蝙蝠項目寫的東西。出於某種原因,它說這種方式不起作用,但如果我翻轉它,它就會起作用。這是爲什麼?當它輸入少於3個字符的東西時,它會根據編碼欄收到錯誤消息。爲什麼這個布爾表達式不工作翻轉?

// Given a string, return a new string where "not " has been added to the front. 
// However, if the string already begins with "not", return the string unchanged. 
// Note: use .equals() to compare 2 strings. 

// notString("candy") → "not candy" 
// notString("x") → "not x" 
// notString("not bad") → "not bad" 

     public String notString(String str) { 
        String m; 
      if (str.substring (0,3).equalsIgnoreCase("not") && str.length() >= 3) // this line doesn't work in it's current state 
      // but works if I flip the two boolean expressions over the && 

        m = str; 
      else { 
        m = "not " + str; 
       } 
     return m; 
+1

因爲你第一次得到'substring'然後檢查它的'length'。如果'length'小於3會發生什麼。'&&'的第一部分會導致錯誤。我的猜測是編譯器處理這種情況的方式。 – Prateek

+3

而不是使用'str.substring(0,3).equalsIgnoreCase(「not」)''你可以使用'str.startsWith(「not」)',如果我們想忽略你傷口的情況加入'str.toLowerCase ).startsWith(「not」)' – Vallentin

回答

6

如果字符串的長度不小於3,那麼str.subtring(0, 3)將會失敗,並顯示IndexOutOfBoundsException

翻轉時起作用的原因稱爲短路評估。翻轉:

if (str.length() >= 3 && str.substring (0,3).equalsIgnoreCase("not")) 

評估第一個條件。如果它小於3,那麼Java知道整個條件是false,因爲false && anythingfalse。它不會評估其他表達式,因爲它不必評估它。 IndexOutOfBoundsException不會出於這個原因。

關於這個JLS, Section 15.23會談:

的條件和操作& &就像&(§15.22.2),但評估 其右邊的操作數只有在其左側的價值操作數是 是true。

此外,邏輯運算符或運算符(條件運算符)||的工作方式也類似。如果左側操作數是falseJLS Section 15.24),它將僅評估其右側操作數。

+0

哇,好了,現在我明白了。感謝所有在這個問題上做出貢獻的人! – Max

3

你上面貼將與StringIndexOutOfBoundsException如果str短於三個字符崩潰,因爲你想獲得一個字符串這還不夠長的3個字符substring的代碼。

但是,當您翻轉它時,您首先檢查字符串的長度。這意味着你馬上知道&&會失敗(因爲str.length >= 3false),所以你short-circuit出有條件的話那麼就有了。因此,你永遠不會嘗試採取不可能的substring,並避免崩潰。

爲鏈接提到,邏輯運算符的兩個以這種方式工作(&&(AND)和||(OR))。如果他們能夠確定在評估左側後應該返回什麼,則右側不會被觸及。因此,例如,(true || 1/0 == 0)將始終評估爲true,即使如果要評估右側,它也會引發異常。

0

這是因爲你檢查

str.substring (0,3).equalsIgnoreCase("not") 

首先,檢查長度之前。因此,如果你的str長度小於3,那麼你可能會產生一個錯誤java.lang.StringIndexOutOfBoundsException

你必須先檢查一個長度(例如通過翻轉條件檢查)。

相關問題