【问题标题】:Three argument operator: Local variable may not have been initialized三参数运算符:局部变量可能尚未初始化
【发布时间】:2012-12-15 17:37:59
【问题描述】:

我有以下代码...

import java.util.Random;

public class ThreeArgumentOperator {

    private static final Random RANDOM = new Random();

    public static void main(String[] args) {
        String test;
        System.out.println(test = getValue() == null ? "" : test);
    }

    public static String getValue() {
        if (RANDOM.nextBoolean()) {
            return "";
        } else {
            return null;
        }
    }

}

Eclipse编译器(我用的是Juno)报如下错误:

可能没有初始化局部变量test

我的问题是:在这种情况下编译器是否应该报告它不能将boolean 转换为String?我知道运算符== 优先于=,因此编译器应该抱怨转换,而不是抱怨可能没有初始化值。

当我更改以下行时

System.out.println(test = getValue() == null ? "" : test);

System.out.println((test = getValue()) == null ? "" : test);

一切正常。

编辑:我也尝试直接使用javac 编译它。它给出了同样的错误。

error: variable test might not have been initialized
System.out.println(test = getValue() == null ? "" : test);

【问题讨论】:

  • 应该,在我的情况下确实如此。
  • @NPE 是不是意味着你得到了Type mismatch: cannot convert from boolean to String?如果是这样,您使用什么编译器?
  • 我现在已经在我的 Eclipse 中测试了这个,编译器给了我你描述的错误。顺便说一句,我使用的是 Sun 的 JDK 7。
  • 请不要这样做,这很容易出错。
  • @RC 它是否容易出错并不重要。这是因为编译器在这种情况下给出了误导性的信息。

标签: java eclipse javac


【解决方案1】:

编译器提供给您的错误是正确的。根据运算符优先级,== 将首先被评估,然后是您的三元运算符? :。也就是说,逻辑流程如下:

getValue() == null

为了继续,我们假设结果是false。下一个表达式:

false ? "" : test

那么这个结果就是test。而我们的最终表达......

test = test

test 从未初始化,因此出现错误。

【讨论】:

  • 这是一个完美的解释!谢谢。
  • 很高兴听到它很有用。 :)
【解决方案2】:

我真的不明白问题出在哪里。第一个表达式是

test = getValue() == null ? "" : test

这意味着:test 被初始化为

  • 如果getValue()返回null,则为空字符串
  • test 的值否则

由于 test 尚未初始化,您无法使用自身初始化 test,因此出现错误消息。

第二个表达式是

(test = getValue()) == null ? "" : test

意思是:

  • getValue()的结果初始化test
  • 比较testnull
  • 如果 test 为 null,则表达式的计算结果为空字符串
  • 否则它的计算值为test

为什么不能编译?

【讨论】:

  • 我在哪里写第二个不应该编译?无论如何,也感谢您的回答。
  • 好的,我再次阅读了我的问题并重新排列了一些句子,确实可能有点模棱两可。
【解决方案3】:

这对我来说很有意义。

第二个编译版本实际上是两个单独的语句。相当于这段代码:

test = getValue();
System.out.println(test == null ? "" : test);

第一个给test赋值:

test = getValue();

现在test 有一个值。在test不为空的情况下,第二条语句能够确定表达式的结果值。

第一个非编译版本是一条语句,由于test还没有值,分配给test的值(即test)是未知的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多