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

Java 使用变量,在switch语句中初始化,外部,java,variables,if-statement,switch-statement,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();

我在访问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)

添加
默认值
大小写以捕获任何无法识别的输入。在您的情况下,这可能会引发一个
运行时异常
,因为如果达到这种情况,您的代码就会出现问题

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

您收到的错误意味着存在无法初始化
ans
的代码路径。不要采取简单的方法,在声明时使用无意义的值初始化
ans
!这只会隐藏有关代码实际问题的宝贵警告。

局部变量(如
ans
)必须在使用前初始化


所以只要给ans赋值零就行了如果你声明了一个局部变量(在函数内部),你应该总是初始化它

int svar = 0;
int ans = 0;

如果您在函数外部声明它,那么它将被自动初始化为0,但这不是一个好的做法,因为编译器不知道ans是否会被初始化,所以您会得到此编译错误, 原因是在编译时,不知道是否会执行开关条件,因此编译错误。要解决此问题,请将ans初始化为某些值,如:

ans = -1;

再看看这个,只需更改您的声明
intsvar,ans
intsvar,ans=0
以删除此错误。问题是变量ans没有在这一行初始化:
如果(svar==ans)
并且您的开关盒没有默认的
盒。

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

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

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

如果您的
开关中的所有情况都失败
,则将永远不会初始化
ans

您在开关之前没有初始化ans


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

非常感谢,谢谢!因此,只有在默认情况不可行的情况下,才应该存在初始化的局部变量(int ans=0;)?如果无条件地使用值初始化变量,这就是默认情况。只有当零是程序可以有意义地使用的
ans
的有效值时,才应该这样做。是的,我看到
//永远不会在有这么多bug的站点上出现
注释。