我在访问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)
答案 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)
答案 5 :(得分:0)
只需将您的声明int svar, ans;
更改为int svar, ans=0;
即可删除此错误。问题是您的变量ans未在此行初始化:if (svar == ans)
且您的开关案例没有default
案例。
答案 6 :(得分:0)
你没有在切换之前初始化ans。
我不推荐erikson的答案,因为你的randomChar只会给你处理输入(你永远不会达到默认情况)。