如何在Java的if语句中给变量赋值?

8

我需要做类似于这样的事情:

if (first_var > second_var)
  int difference = first_var - second_var;
if (first_var < second_var)
  int difference = second_var - first_var;

当我尝试编译这个程序时,出现了一个错误,指出变量“difference”可能没有被初始化。 将变量“difference”定义为全局变量也没有帮助。
7个回答

28

你需要学习的问题包括:

  • 变量的作用域
  • 块声明及其如何创建新的作用域
  • 为什么应该优先使用{...}块来表示if语句
  • 如何保证明确的赋值
  • 何时使用if-else而不是if (something) {...} if (!something) {...}

顺便说一下,找到两个值的差异的惯用方式是:

int difference = Math.abs(firstVar - secondVar);

请注意,Math.abs存在一个特殊情况:当参数是Integer.MIN_VALUE时,返回值为Integer.MIN_VALUE。这是因为-Integer.MIN_VALUE == Integer.MIN_VALUE。这里的问题涉及到32位二进制补码表示法。

参考资料


尝试 #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本地变量的可能性,因为它可能会被赋值两次。


第三次尝试: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;

这里使用了?:三元/条件运算符。请注意,这个运算符有一些行为可能会让人惊讶,并且它确实容易被滥用。请谨慎、审慎、地道地使用。

参考资料


使用{...}是一种风格选择。当然,如果您不小心的话,就会遇到悬挂else问题,但这个教训只是在省略{...}时要小心 :) - Peter Alexander
@Peter Alexander 格式和缩进也是一种风格选择... 你明白我的意思吗? ;) - Ivo Wetzel

4

您有两个选项:

  1. Do the condition on one line using the ternary operator ?:

    int difference = first_var > second_var ? first_var - second_var : second_var - first_var;
    
  2. Declare the variable up front, then do the condition.

    int difference = 0;
    if (first_var > second_var)
      difference = first_var - second_var;
    if (first_var < second_var)
      difference = second_var - first_var;
    

3

您只能在一个地方声明变量。

基本解决方案是

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;

3

这是因为变量可能确实没有被初始化。实际上,如果first_varsecond_var相等,它将不会被初始化。除此之外,即使你添加了第三个if,编译器可能也不够聪明来解决这个问题。把声明移动到if外面,并在那一行上初始化它的值。

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);

1

首先,你必须在if语句之外定义你的变量"difference":

int difference;
if (first_var > second_var)
    difference = first_var - second_var;
if (first_var < second_var)
    difference = second_var - first_var;

然后,编译器无法确定在执行两个if语句后,您的变量是否会有一个值。例如,如果first_var和second_var具有相同的值,则不会分配difference。因此,如果您尝试使用变量,将会出现编译时错误。

要解决这个问题,您有两个解决方案:

第一个解决方案是给您的变量一个默认值,如果没有完成其他条件,则将使用该值:

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;
}

0
可能未初始化的原因是您考虑了 A < B、B < A,但没有考虑 A == B。请考虑这一点:
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;

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接