【发布时间】:2022-06-25 18:26:14
【问题描述】:
以下 sn-p 无法在 javac 版本 17 (Temurin) 上编译
class Instanceof {
static void doesNotWork(Object o) {
if (o == null) {
throw new Error();
} else if (!(o instanceof String s)) {
throw new Error();
}
System.out.println(s); // error here
}
}
它会产生这个错误:找不到符号
cannot find symbol
symbol: variable s
location: class Instanceof
但是,以下(在我看来)等效的变体有效: 使用明确的 else 块:
static void doesWork(Object o) {
if (o == null) {
throw new Error();
} else if (!(o instanceof String s)) {
throw new Error();
} else {
System.out.println(s);
}
}
或者没有 else:
static void doesWork(Object o) {
if (o == null) {
throw new Error();
}
if (!(o instanceof String s)) {
throw new Error();
}
System.out.println(s);
}
或者用一个 if:
static void doesWork(Object o) {
if (o == null || !(o instanceof String s)) {
throw new Error();
}
System.out.println(s);
}
这是 javac 中的错误吗? 如果是,我应该报告这个,但具体在哪里?
【问题讨论】:
-
@RealSkeptic 见docs.oracle.com/en/java/javase/17/language/…
-
相关部分是§6.3.1 - 错误表明
javac认为变量s不在此范围内,因为错误是“s?What s?”。这就像一个javac错误,但我还没有找到javac在这里打破规范的确切章节。 -
对我未经训练的眼睛来说,这似乎是个问题。我看不出您所展示的示例会起作用的任何合乎逻辑的原因,但那个不起作用。你可以在这里报告错误:bugreport.java.com/bugreport
-
我怀疑这是 if-then-else 与 if-then 的可达性不同,具体取决于子句的主体。
-
与 Eclipse 一起工作。作为旁注,
null支票在这里已过时......
标签: java language-lawyer java-17