使用变量,在switch语句中初始化,在外部

时间:2011-11-29 19:54:15

标签: java variables if-statement switch-statement

我在访问switch语句中初始化的变量时遇到问题,然后在switch外部使用它们。

这是我的代码应该产生的: 什么是: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);

        }
}

如您所见,“ans”已被声明并初始化。但是,我想在if语句(为了比较结果)和输出中使用ans变量。

现在我可以扩展每个案例并编写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)

7 个答案:

答案 0 :(得分:2)

添加default案例以捕获任何无法识别的输入。在您的情况下,这可能会抛出RuntimeException,因为如果遇到这种情况,您的代码会出现问题。

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

您获得的错误意味着存在无法初始化ans的代码路径。 采取简单的方法并在声明时使用无意义的值初始化ans!这只会隐藏有关您的代码真正问题的宝贵警告。

答案 1 :(得分:1)

与实例变量不同,局部变量不会自动初始化。

您需要将其显式初始化为默认值。

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

如果switch中的所有案例都失败,那么ans永远不会被初始化。

答案 2 :(得分:0)

必须在使用前初始化ans等局部变量。

所以只需为ans

指定零

答案 3 :(得分:0)

如果声明局部var(在函数内),则应始终初始化它

int svar = 0;
int ans = 0;

如果你在一个函数之外声明它,那么它将自动用0初始化,但这对于这个不是很好的做法

答案 4 :(得分:0)

你得到这个编译错误,因为编译器不知道是否会初始化ans, 因为在编译时不知道是否将执行切换条件因此编译错误。要解决它,请将ans初始化为某些值,如:

ans = -1;

另请查看此postthis

答案 5 :(得分:0)

只需将您的声明int svar, ans;更改为int svar, ans=0;即可删除此错误。问题是您的变量ans未在此行初始化:if (svar == ans)且您的开关案例没有default案例。

答案 6 :(得分:0)

你没有在切换之前初始化ans。

我不推荐erikson的答案,因为你的randomChar只会给你处理输入(你永远不会达到默认情况)。