2012-03-10 66 views
1

我在if語句中遇到範圍問題,至少,我很確定這是我的錯誤所在,而且我不確定如何解決問題(我在編程方面很新穎)。Java程序中的if語句中的範圍錯誤

基本上,如果我在if語句中聲明某些內容,變量(在本例中是一個結構數組)不存在於if語句之外。然而,我真的需要數組的聲明在if/else中,因爲數組的大小依賴於N,所以我該如何解決這個錯誤?

該程序是在Java中,我使用Eclipse。任何見解都非常感謝。

//declare an int (used in determining array length) 
int N = 4; 

//declare instance of MyClass 
MyClass myClass = new MyClass(); 

//declare and array, then initialize each struct in that array 
     if(N <= 26){ 
      MyStruct array[] = new MyStruct[260]; 
      for(int i = 0; i < array.length; i++){ 
       array[i] = new MyStruct(); 
      } 
     } 

     else{ 
      MyStruct array[] = new MyStruct[N*10]; 
      for(int i = 0; i < array.length; i++){ 
       array[i] = new MyStruct(); 
      } 

//lots of other code goes here of stuff that needs to be done before myMethod can be called 

//call a method in myClass that requires 'array' to be passed in 
myClass.myMethod(array);  // ERROR - ARRAY CANNOT BE RESOLVED TO BE A VARIABLE 

回答

2

你需要移動數組聲明MyStruct array[];if。你回答了你自己的問題,事實上,當你在一個塊中聲明一個局部變量(一段代碼被{}包圍)時,該變量將僅在該塊內部可見,按照Java語言的範圍規則。

你可以做什麼ifelse塊,被實例化數組正確的尺寸,這樣的:

MyStruct[] array; 

if (N <= 26) { 
    array = new MyStruct[260]; 
    for (int i = 0; i < array.length; i++) { 
     array[i] = new MyStruct(); 
    } 
} 

else { 
    array = new MyStruct[N*10]; 
    for (int i = 0; i < array.length; i++) { 
     array[i] = new MyStruct(); 
    } 
} 

更短的解決辦法是:

MyStruct[] array = new MyStruct[N <= 26 ? 260 : N*10]; 
for (int i = 0; i < array.length; i++) { 
    array[i] = new MyStruct(); 
} 
+0

啊 - 我想到了,但是,唉,我想數組的大小取決於變量N.如果N <= 26,使數組成爲一定的大小,否則使陣列的大小不同。因此,我必須把數組的聲明放在if/else中,對嗎?或者我錯了? – Tabitha 2012-03-10 21:13:38

+0

@Tabitha我剛剛編輯了我的答案,提供了更多細節和問題的解決方案 – 2012-03-10 21:14:59

1

array聲明放在if聲明的範圍之外。

2

其他人回答了爲什麼這是一個問題以及如何避免它,但我實際上改變了方法。目前,你有兩個重複代碼塊 - 爲什麼不避免呢?

int length = Math.min(N, 26); 
MyStruct array[] = new MyStruct[length]; 
for(int i = 0; i < array.length; i++) { 
    array[i] = new MyStruct(); 
} 

MyClass myClass = new MyClass(); 
myClass.myMethod(array); 

(注意這個名字MyStruct有內涵在Java中這很可能是不合適的。我意識到這只是一個虛擬的名字,但Java沒有類似的東西從C「結構」或C#,只是如果你正在等待其他東西......)