java: 为什么比较。当我在声明期间使用 {} 初始化数组时出错

标签 java arrays initialization

如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误

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/

相关文章:

java - 这样做的正确方法是什么?初始化/符号未找到错误

java - Axon - 在查询时进行投影的最简单方法

java - 无法将 'cluster' 下的属性绑定(bind)到 com.datastax.driver.core.Cluster

java - 将字符串数组转换为 int 数组,然后将 int 转换为 *

iphone - C++ 中的静态初始化与 Objective-C 混合

c - 全局变量的意外初始化

java - 使用 `where values in list`的Grails GORM 3.2.0查询

java - 此 Activity 的错误消息 : You need to use a Theme. AppCompat 主题

c - 当我们尝试在函数中复制字符数组时出现段错误

javascript - 在 JavaScript 中删除数组元素 - 删除与拼接