如何在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条件运算符?:

你有两个选择:

  1. 使用三元运算符在一行上执行条件?:

     int difference = first_var > second_var ? first_var - second_var : second_var - first_var; 
  2. 预先声明变量,然后执行条件。

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

这是因为变量可能确实没有被初始化。 实际上,如果first_varsecond_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;