2015-04-17 28 views
0

在我的任務中,我應該創建一個程序,該程序使用開關盒訪問不同類的方法來執行某些操作。第一種情況需要用戶輸入,並且該輸入用於其他類的構造函數中。然而,如果我在第一種情況下初始化類對象,我從其他情況下得到錯誤,因爲對象可能尚未初始化。我如何爲擁有我的方法的類創建該對象,並仍然將開關案例中提示的用戶輸入獲取到構造函數中?我知道構造函數的參數之前如何初始化類對象?

public class NumberList{ 

int length; int offset; 

    public NumberList(int length, int offset){  //constructor 
     this.length = length; this.offset = offset; 
    } 

    public void shift(int a){      //shift method 
     temp = numbers[0]; 
     for (int i = 0; i < length-1; i++) { 
     numbers[i] = numbers[i+1]; 
     } 
     numbers[length - 1] = temp; 
     } 

說這是我的班,有一個方法來移動數組元素。我的主要方法是

public class assignment7{ 
public static void main(String[] args){ 

int choice; 
do{ 
System.out.println("input choice"); 
choice = scan.nextInt(); 
switch(choice){ 

     case '1': 
      System.out.println("input the array size."); 
      size = scan.nextInt(); 
      System.out.println("input the array offset."); 
      offset = scan.nextInt(); 
      NumberList numbasbrah = new NumberList(size, offset); 
      numbasbrah.printInfo(); 
      break; 
     case '2': 
      numbasbrah.shift(); 
      numbasbrah.printInfo(); 
      break; 
     case '3':  //quit 
      break; 
}while(choice!=3); 
}} //end main method 

所以如果我創建的開關情況下,我得到「變量可能尚未初始化」錯誤的NumberList對象,但它需要有這樣我就可以在添加用戶輸入構造函數。我如何初始化對象,同時仍然能夠在開關情況下添加構造函數的信息?

+0

這是所有的代碼? NumberList如何在沒有任何數字聲明[]的情況下編譯? –

+0

不,我試圖壓縮......它可能是總代碼的1/8,實際的NumberList總共有6種方法 –

+0

所以如果用戶選擇案例2,那麼應該移動什麼?那裏會有默認值嗎? –

回答

3

的問題是,你正在使用numasbrah的情況下,2但如果創建它1.

你有什麼儘管這是迫使你之前進入的情況下要經過的情況下1 2

如果有人選擇2而沒有選擇1,那麼程序將失敗。

有很多方法可以解決這個問題 - 包括在switch語句之外創建一個「default」numasbrah。可能最簡單的方法就是將case 2完全刪除,並從案例1中將其徹底移除。

+0

我有指示要這樣做!這就是爲什麼即時通訊如此困惑 –

+0

@TylerWeber在啓動時,你應該讓用戶立即插入值,因爲用戶仍然必須選擇案例1才能運行該程序,使案例2毫無意義1沒有案件1 – Joseph118

+0

我的問題是一個由計算機自動分級的學校作業,它被編程爲首先按下第一個案例,然後輸入信息 –

1

問題是您正在實例化案例1範圍內的類,該範圍之外的任何內容都無法訪問該對象。更多關於示波器的信息here

但立即解決問題,如果你想在情況1中創建的對象進行訪問的情況下,2只創建情況外,但在交換機內部(使用默認值創建):

switch(choice){ 

    NumberList numbasbrah =new NumberList(defaultValue, defaultVale); 

     case '1': 
      System.out.println("input the array size."); 
      size = scan.nextInt(); 
      System.out.println("input the array offset."); 
      offset = scan.nextInt(); 
      numbasbrah = new NumberList(size, offset); 
      numbasbrah.printInfo(); 
      break; 
     case '2': 

      numbasbrah.shift(); 
      numbasbrah.printInfo(); 

      break; 
     case '3':  //quit 
      break; 
} 

注意

這裏的邏輯似乎有缺陷。如果用戶選擇案例2,會不會有一個默認的numbasbrah?

+0

這將編譯但仍然拋出空指針異常,如果他們先選擇案例2。至少你應該空檢查numbasbrah –

+0

這將創建一個空錯誤......這意味着他回到了1 .. – Joseph118

0

如果不創建對象,就不能使用對象,這就是你需要知道的一切!因此,無論您是否在第一種情況下都在switch case中聲明它,並且您必須確保用戶將在案例2之前處理案例1,或者您可以添加一個新的布爾變量來告知對象是否已經創建與否,並在使用該對象的情況下使用它,以確保它已被創建!這就是我會做的。

或者使用if(numbasbrah != null)作爲Eduardo說

+0

你能解釋你將如何使用布爾值?它會允許程序編譯並運行,同時保留「NumberList numbasbrah = new NumberList(size,offset);」在第一種情況下? –

+0

當你創建你的'NumberList'時賦值爲一個布爾值,在第二種情況下,添加'if(theBoolean)'然後執行你所需要的操作,並在else語句中向用戶表明該對象還沒有被創建 –

0

我想是因爲case 1總是需要一步這裏開關的情況下在這裏不需要。例如,如果您將對象定義爲空(如@Eduardo Dennis答案),然後您將它們指定爲case 2,則它將爲您提供空指針,另一方面,如果您已經初始化對象,則在兩種情況下都需要對象初始化爲什麼不刪除case 1並將其定義在switch之外或者最好是刪除開關並使用if else

相關問題