2011-11-29 65 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