初始化变量Java

初始化变量Java,java,initialization,Java,Initialization,我正在写一个简单的程序,带有do-while循环和开关,cna接受一个数学运算并对给定的2个数字执行它 我的问题是,为什么要在开始时将操作产生的结果初始化为零 如果我不使ans=0,它会给我错误。如果不满足给定的条件,一些代码部分就不会执行,我不需要“ans” q3包; 导入java.util.Scanner; 公开课Q3{ 公共静态void main(字符串[]args){ 扫描仪输入=新扫描仪(System.in); 字符算子; float no1,no2,ans=0;//这是因为如果没有一

我正在写一个简单的程序,带有do-while循环和开关,cna接受一个数学运算并对给定的2个数字执行它

我的问题是,为什么要在开始时将操作产生的结果初始化为零

如果我不使ans=0,它会给我错误。如果不满足给定的条件,一些代码部分就不会执行,我不需要“ans”

q3包;
导入java.util.Scanner;
公开课Q3{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
字符算子;

float no1,no2,ans=0;//这是因为如果没有一个case的计算结果为true,则不会设置
ans
的值。因此不能使用它


您可以通过添加一个
默认值
大小写,并将
ans
的值设置为0来克服这个问题。

您应该初始化
ans=0;
因为您没有
ans
的默认值,因此需要初始化它。
但是,如果添加default值,则不需要像这样初始化它:

    ...
    case '-':
    ans = no1 - no2;
      break;
    default :
    ans = someValue; 
     break; 

嗯,可能是没有一个case语句适用,因此,
ans
仍然会被取消初始化。由于局部变量在使用之前必须进行初始化,因此会出现此错误。

Java要求在使用所有局部变量之前对其进行初始化

在打印行中,您读取了
abs
的值,但并不是所有的控制路径都为其设置了值。(即使您认为您已经涵盖了
开关的所有可能性,但考虑到外部
if
,编译器将不会这样看:其他线程可能会修改
运算符


因此,您的IDE/编译器建议您在声明时对其进行初始化。

如果您没有对其进行初始化,那么首先会有一个垃圾值

不必对其进行初始化


但是,如果您对程序进行初始化,它将是一个更好的程序。

为什么?请重新表述您的问题,使其更有意义。。就Java编译器所能确定的而言,您的switch语句中的所有情况都可能不匹配,并且不会分配
ans
。您可能知道这是不可能的,但编译器确实这样做了不知道。如果给定的条件没有满足,这不允许开关或任何其他代码执行,那么初始化有什么意义呢?@laish129是的,但是java编译器无法理解所有这些事情,因为它是在
if
构造中,它可能会计算,也可能不会计算!所以我应该在开关中使用默认情况吗?我不会但是如果我去掉if,no1和no2的值就必须被赋值,因为不需要做任何操作。?!是的。你在重新设计时遇到了困难。你应该建立一个函数来计算操作符的算术。这个函数将替换
if
。这样你就知道你需要多少参数了。T当你能够区分否定和减法,并且可以处理诸如“代码> 1×1”< /> >的表达式时,表达式分析器往往会变得更复杂。这都是为了将来的需求而设计。这对于C/C++,而不是java是正确的。在C++和C++中,读取未初始化值的行为是未定义的。Java,这样的构造在编译时必须失败。
    ...
    case '-':
    ans = no1 - no2;
      break;
    default :
    ans = someValue; 
     break;