如何在Java中的if语句中为变量赋值
我需要做这样的事情,
if (first_var > second_var) int difference = first_var - second_var; if (first_var < second_var) int difference = second_var - first_var;
当我尝试编译它时,会出现一个错误,指出变量“差异”可能尚未初始化。 使变量“差异”全局也无济于事。
您需要学习的问题是:
- 变量的范围
- 块声明以及如何创建新范围
- 为什么你更喜欢对
if
语句使用{...}
块 - 如何保certificate确的任务
- 何时使用
if-else
而不是if (something) {...} if (!something) {...}
顺便说一下,找到两个值的差异的惯用方法是:
int difference = Math.abs(firstVar - secondVar);
请注意, Math.abs
有一个Math.abs
情况:当参数为Integer.MIN_VALUE
,返回的值为Integer.MIN_VALUE
。 那是因为-Integer.MIN_VALUE == Integer.MIN_VALUE
。 这里的问题是数字的32位二进制补码表示。
参考
- JLS 16定义赋值
- JLS 14.4.2局部变量声明的范围
- JLS 14.9.2 if-then-else语句
-
Math.abs(int)
- 维基百科/二的补码 (读:最负数)
尝试#1:在if
之前声明
这是通过在if
之前声明变量来尝试修复片段的尝试
int difference; if (first_var > second_var) { difference = first_var - second_var; } if (first_var < second_var) { difference = second_var - first_var; } // note: difference is not definitely assigned here! // (but at least it's in scope!)
我们现在有一个明确赋值的问题:如果first_var == second_var
,变量difference
仍然没有赋值。
尝试#2:在声明时初始化
这是第二次尝试:
int difference = 0; if (first_var > second_var) { difference = first_var - second_var; } if (first_var < second_var) { difference = second_var - first_var; } // note: difference is in scope here, and definitely assigned
初学者倾向于这样做,但这排除了将difference
作为final
局部变量的可能性,因为它可能被赋值两次。
尝试#3: if-else
这是一个更好的尝试:
final int difference; if (first_var > second_var) { difference = first_var - second_var; } else { difference = second_var - first_var; } // note: difference is in scope, and is definitely assigned here, // (and declared final)
仍然有办法改善这一点。
尝试#4:三元/条件运算符
一旦你对语言和编程更加熟悉,你可以使用以下习语:
final int difference = (first_var > second_var) ? first_var - second_var : second_var - first_var;
这使用?:
三元/条件运算符。 小心这个操作员; 它有一些令人惊讶的行为,它肯定会被滥用。 谨慎,明智地,惯用地使用。
参考
- JLS 15.25条件运算符
?:
你有两个选择:
-
使用三元运算符在一行上执行条件?:
int difference = first_var > second_var ? first_var - second_var : second_var - first_var;
-
预先声明变量,然后执行条件。
int difference = 0; if (first_var > second_var) difference = first_var - second_var; if (first_var < second_var) difference = second_var - first_var;
这是因为变量可能确实没有被初始化。 实际上,如果first_var
和second_var
彼此相等,则不会初始化。 除此之外,即使添加了第三个if
,编译器也可能不够聪明。 将声明移到if
s之外,并将其初始化为该行的值。
int difference = 0; if (first_var > second_var) difference = first_var - second_var; if (first_var < second_var) difference = second_var - first_var;
但是,我只是这样做
int difference = Math.abs(first_var - second_var);
您只能在一个地方声明变量。
基本的解决方案是
int difference; if (first_var > second_var) difference = first_var - second_var; if (first_var < second_var) difference = second_var - first_var;
但是在这种情况下,您可以使用内联?:运算符
int difference = (first_var > second_var) ? first_var - second_var : second_var - first_var;
首先,您必须在ifs语句之外定义tour变量“difference”:
int difference; if (first_var > second_var) difference = first_var - second_var; if (first_var < second_var) difference = second_var - first_var;
然后,一旦执行了ifs语句,编译器就无法确定您的变量是否具有值。 例如,如果first_var和second_var具有相同的值,则不会分配差异。 因此,如果您尝试使用您的变量,则会出现编译时错误。
要解决此问题,您有两种解决方案:
第一种解决方案是为您的变量提供一个默认值,如果没有其他条件完成,将使用该值:
int difference = 0; if (first_var > second_var) difference = first_var - second_var; if (first_var < second_var) difference = second_var - first_var;
另一种解决方案是使用else if语句。 使用else if语句时,编译器能够确定是否在所有情况下分配您的变量:
int difference; if (first_var > second_var) { difference = first_var - second_var; } else if (first_var < second_var) { difference = second_var - first_var; } else { difference = 0; }
您确实可以在if语句中分配变量,但不能在if语句中初始化它。 用简单的英语,您可以在if语句中为变量赋值,但不能在if语句中创建变量。 原因是因为如果永远不满足if条件,if语句中的代码可能永远不会运行。
以下是我编写该代码的方法:
int difference = 0; if (first_var > second_var) difference = first_var - second_var; else if (first_var < second_var) difference = second_var - first_var;
它可能没有被初始化的原因是你占A
if (first_var > second_var) int difference = first_var - second_var; if (first_var < second_var) int difference = second_var - first_var; if (first_var == second_var) int difference = 0;