如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误
class Demo {
public static void main(String[] args) {
String[] myName;
myName = {"AA", "BB", "CC"};
for(String s: myName) {
System.out.print(s + " ");
}
}
}
只在声明语句中使用大括号进行初始化有什么意义?
demo.java:4: error: illegal start of expression
myName = {"AA", "BB", "CC"};
^
demo.java:4: error: not a statement
myName = {"AA", "BB", "CC"};
^
demo.java:4: error: ';' expected
myName = {"AA", "BB", "CC"};
^
demo.java:5: error: illegal start of type
for(String s: myName) {
^
demo.java:5: error: ')' expected
for(String s: myName) {
^
demo.java:5: error: <identifier> expected
for(String s: myName) {
^
demo.java:10: error: class, interface, or enum expected
}
^
7 errors
最佳答案
why do I get a compilation error if I try to initialize an array using braces on a statement other than the declaration statement
因为基本上在 Java 中这样做是无效的。编译器只是在执行 Java 语言规范的规则。您需要指定数组类型:
myName = new String[] { ... };
来自Java Language Specification, section 10.6 :
An array initializer may be specified in a declaration (§8.3, §9.3, §14.4), or as part of an array creation expression (§15.10), to create an array and provide some initial values.
有关声明的各个部分包括此产生式:
VariableInitializer:
Expression
ArrayInitializer
而数组创建表达式 ( section 15.10) 是:
ArrayCreationExpression:
new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
DimExprs:
DimExpr
DimExprs DimExpr
DimExpr:
[ Expression ]
Dims:
[ ]
Dims [ ]
后来:
what's the point of having to initialize using braces only in the declaration statement?
我怀疑它在其他方面简化了语言规范。我同意它看起来您应该能够做到这一点 - 您可能希望编译器能够从变量类型推断出数组类型,就像它在声明时所做的那样。但请记住,一般来说,对于大多数语言,赋值运算符右侧的表达式类型不受任务。在不引用同一语句中的其他表达式的情况下,在正常语句中定义良好的每个表达式的类型通常在语言术语上更简洁。
使用数组创建表达式修复代码相当容易,所以我会接受它。
关于java: 为什么比较。当我在声明期间使用 {} 初始化数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658575/