Java编译器出现奇怪语法-错误的起始表达式。

9
我遇到了一个奇怪的错误,我认为这是一个bug。 以下是一个最小化的代码案例,请勿评论代码的实用性 :)
class Foo {

    static public <X> int bar() { return 42; }

    public int baz() {
        return true ? 42 : (
            Foo.<Void>bar() > 42 ? 41 : 43
        )
        ;
    }
}

结果:

err.java:7: illegal start of expression
        Foo.<Void>bar() > 42 ? 41 : 43
            ^

我尝试过SUN SDK javac 1.6.0_13和1.6.0_21。
当我执行以下操作之一时,错误消失了:
  • 将bar()变为非泛型(仅出于好奇,不是真正的选项)
  • 删除第7行三元表达式周围的括号
因此,看起来如果e是一个表达式,那么写成(e)并不总是有效的?
4个回答

6

我使用Eclipse编译并运行这段代码没有问题,但是我可以确认使用javac编译会失败。我怀疑你已经发现了一个javac编译器的bug。

最好还是报告一下这个问题。


谢谢Joachim。这正是我担心的(目前我被困在标准SDK javac 1.6中)。我将不得不搜索Sun/Oracle的错误数据库以找出是否已经修复了该问题。 - Ingo
1
这个 bug 已经存在了大约 3 年,但显然不会在 jdk 1.6 中修复。然而,在 jdk 1.7 beta 14 中已经修复了它(开发者预览版是 b189,所以它已经在那里被修复了)。 - Ingo
@Ingo:能否添加一下你发现的错误链接? - Paŭlo Ebermann
@Paulo:很遗憾,是的,因为在 Oracle 网站上未显示该错误。不过,由于谷歌的缓存,如果有幸找到了,可以查看它。该错误的 ID 是 6608961,说明它是 bug 6481655 的副本,“已在 Java 7 beta 27 中修复”。希望这仍然有所帮助。 - Ingo
3
错误链接:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6481655 和 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6608961。 - Tyler

1

我在代码中进行了一点更改,成功编译了它。因此,我猜测这与条件运算符规范(有些复杂)或者一个 bug 有关。但是这个问题只出现在条件运算符中。

class Foo {

    static public <X> int bar() { return 42; }

    public int baz() {
        return true ? 42 : (
            ((int)Foo.<Void>bar()) > 42 ? 41 : 43
        );
    }
}

太酷了!看起来编译器有些困惑,认为“(Foo”必须开始一个转换? - Ingo
@Ingo:你是对的。但一般的指导方针是“不要在混合数据类型中使用条件运算符(因为规范有点复杂)”。但在这种情况下,你没有使用混合类型。 - Prince John Wesley

1

这个 bug 已经存在了三年之久,但显然不会在 jdk 1.6 中修复。然而,在 jdk 1.7 beta 14 中已经修复了它(开发者预览版是 b185,所以它已经被修复了,我已经尝试过了)。


-3

是返回值,您不必通过调用静态方法来指定它:

class Foo {

    static public <X> int bar() { return 42; }

    public int baz() {
        return true ? 42 : (
            Foo.bar() > 42 ? 41 : 43     
        )
        ;
    }
}

声明 <Void> 不指定返回值,它在这里指定了类型参数! - Joachim Sauer
正如我所解释的那样,这段代码纯粹是为了演示。相信我,在真正的程序中,类型参数是不可或缺的。 - Ingo

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