2011-11-29 83 views
2

訪問在switch-statement中初始化的變量,然後在switch外部使用它們時遇到問題。使用變量,在switch-statement中初始化,在外部

這是我的代碼應該產生: 的是:X(+ - * /或)X

這裏是我的Java代碼:

import java.util.Random; 
import java.util.Scanner; 

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

     Random rand = new Random(); 
     Scanner sc = new Scanner(System.in); 

     int svar, ans; 
     int tal1 = rand.nextInt(100) + 1; 
     int tal2 = rand.nextInt(100) + 1; 

     String characters = "+-*/"; 
     int r = rand.nextInt(characters.length()); 
     char randomChar = characters.charAt(r); 

     switch(randomChar){ 
     case '+': 
      ans = tal1 + tal2; 
      break; 
     case '-': 
      ans = tal1 - tal2; 
      break; 
     case '*': 
      ans = tal1 * tal2; 
      break; 
     case '/': 
      ans = tal1/tal2; 
      break; 
     } 

     System.out.println("What is: "+tal1+randomChar+tal2+"?"); 
     svar = sc.nextInt(); 

     if (svar == ans) 
      System.out.println("Correct!"); 
     else 
      System.out.println("Wrong - Right answer: "+ans); 

     } 
} 

正如你所看到的, 「答」 有已被宣佈並初始化。但是,我想在if語句(爲了比較結果)和輸出中使用ans變量。

現在我可以擴展每個case並編寫if語句和輸出,但是代碼太過分了,因爲我試圖做類似的代碼,但更小。任何提示這項工作將如何工作?

這裏的編譯錯誤,我得到:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The local variable ans may not have been initialized 
    The local variable ans may not have been initialized 

    at Test2.main(Test2.java:36) 

回答

2

添加default情況下,將用一個不承認任何輸入。在你的情況下,這可能會拋出一個RuntimeException,因爲如果遇到這種情況,代碼有問題。

default: 
    throw new RuntimeException("Unexpected operation: " + randomChar); 

你越來越意味着有失敗初始化ans代碼路徑的錯誤。做不是採取簡單的方法,並初始化ans時它宣佈無意義的價值!這隻會隱藏這個有關代碼真正問題的寶貴警告。

+0

非常感謝,謝謝!所以像(int ans = 0;)這樣的初始化局部變量應該只存在於默認情況下不可行的情況下? – Racket

+0

如果你無條件地用一個值初始化一個變量,*這是默認情況。*你應該這樣做,如果零是ans的有效值,你的程序可以以有意義的方式使用。 – erickson

0

局部變量如ans必須在使用前初始化。

所以才賦值零ans

0

如果要聲明一個局部變量(函數內),你應該總是初始化

int svar = 0; 
int ans = 0; 

如果你聲明它的功能之外,那麼它會自動初始化爲0,但這不是很好的做法

0

你得到這個編譯錯誤,因爲編譯器不知道ans是否會被初始化, 原因是在編譯時它如果開關條件將被執行,則不知道編譯錯誤。要解決它初始化答到某一值時,如:

ans = -1; 

也看看這個postthis

0

只需將您的聲明中更改int svar, ans;int svar, ans=0;消除這種誤差。問題是你的變量ans沒有在這一行被初始化:if (svar == ans)和你的switch case沒有default的情況。

1

與實例變量不同,局部變量不會自動初始化。

您需要將其顯式初始化爲默認值。

int svar, ans = 0; // assuming 0 is default value for ans 

如果所有的情況下,在你switch失敗了ans將永遠不會被初始化。

0

您在切換前沒有初始化ans。

我不推薦erikson的回答,因爲你的randomChar只會給你處理的輸入(你永遠不會達到默認情況)。

+0

是的,我發現在這麼多的錯誤網站上// //永遠不會發生評論。 – erickson