2015-06-21 62 views
0

我不明白爲什麼後續的Java代碼拋出一個異常ArrayIndexOutofBound怎麼做Java的手柄&&內if語句

while (intArray[j] < intArray[j - 1] && j > 0) { 
     int temp = intArray[j - 1]; 
     intArray[j - 1] = intArray[j]; 
     intArray[j] = temp; 
     j--; 
    } 

它出現的原因,即使我AND(& &)兩個條件,它會首先執行其中一個條件來檢查它是否符合條件,在這種情況下,它將是intArray [0] < intArray [-1]並導致出現異常。起初讓我困惑,現在我只是在遊蕩,爲什麼程序會這樣呢?

+0

你爲什麼要用while語句?在這種情況下,您可以使用'for' – Andrew

+0

@Andrew Tobilko,這是我的插入排序練習演示代碼的一部分。 http://blog.csdn。net/shanwu1985 /文章/詳情/ 46585999 – shanwu

回答

4

條件評估從左到右,這意味着intArray[j] < intArray[j - 1]首先被評估。因此,如果j < = 0,則會發生異常。

更改爲了

while (j > 0 && intArray[j] < intArray[j - 1]) { 

將防止異常(假設j的初始值不太高)。

+0

它總是從左到右進行評估?還是依賴於Java編譯器? – shanwu

+1

@山武,不僅適用於java,也適用於所有語言。是的,從左到右。 –

1

應該是這樣的:

while (j > 0 && intArray[j] < intArray[j - 1]) { 
     int temp = intArray[j - 1]; 
     intArray[j - 1] = intArray[j]; 
     intArray[j] = temp; 
     j--; 
    } 

如果第一條件,j > 0爲假,則第二個不評估(和簡化版,扔當然任何異常)。

如果您使用單個&而不是&&,條件的順序並不重要,因爲兩者都會被評估,即使第一個條件是錯誤的。

編輯

&(按位與運算),並&&(視情況而-AND)

public class LogicalOperators { 

    public static void main(String[] args) { 

     int n = 0; 
     int k = 5; 

     if(n != 0 && k % n == 0) { 
      System.out.println(n + " is a divisor of " + k); 
     } 

     if(n != 0 & k % n == 0) { 
      System.out.println(n + " is a divisor of " + k); // throws ArithmeticException 
     } 
    } 
} 
+0

在這種情況下,你能給我一個'&'的例子嗎?我認爲'&'是用於位操作的... – shanwu

0

這將失敗之間的差的一個簡單的例子,當j的值將成爲1它將在執行到最後一步後進入循環,它將變爲0.當它再次到達下一步時,它將比較int [0]和int [-1],這將最終拋出arrayindexout綁定,因爲它將得到評估beforj> 0。

1

Java使用從左到右的惰性評估。你可能會得到這個例外有三個原因。

  • 如果將j < 0然後intArray [j]的將拋出異常
  • 如果將j < 1然後intArray [J-1]將拋出異常
  • 在j> = intArray.length,然後intArray [j]會拋出異常。

此外,你的循環應該考慮Ĵ< intArray.length

無論如何,如果你想實現一個下沉/泡算法,你的代碼是錯誤的,因爲它找到了它,就立即停止排序幾個元素。並重復自己和令人厭惡。

+0

實際上,它是插入排序...完整代碼如下: http://blog.csdn.net/shanwu1985/article/details/46585999 – shanwu

+0

好的。請注意,&&與&不同。第二個將在條件下執行每個操作,而第一個會在發現錯誤時立即停止。 ||相同和|,第一個會立即停止,它發現一個真實的情況 –

+0

感謝提醒 – shanwu