4
private static final long[] reservedFromIps;

static {
    reservedFromIps = {0l, 167772160l, 1681915904l, 
        2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
        3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

错误是“表达式的非法开始,而不是语句,;预期”

而以下工作正常:

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l, 
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
4

4 回答 4

5

这与块无关static,数组常量只能在初始化器中使用。这就是指定语言的方式。
此代码也不会编译:

public class Test {
    public static void main(String[] args) {
        long[] reservedFromIps;
        reservedFromIps = {0l, 167772160l, 1681915904l, 
                2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
                3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
    }
}

为什么会出现这种情况可能是一个增加了编译器复杂性的问题,几乎没有增加收益,但要完全确定您必须与 Java 设计团队一起讨论。

于 2012-09-18T21:33:23.210 回答
3

首先,您的静态初始化程序块(或您的字段声明)中有一个错字。其次,您必须这样做:

static {
        reservedFromIps = new long[]{0l, 167772160l, 1681915904l, 
            2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l, 
            3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l}; 
}

数组常量只能在初始化器中使用,而不能在重新分配数组时使用。

于 2012-09-18T21:32:42.057 回答
1

Java 编译器无法解析速记表达式的类型。语法在表达式之前需要类型标识符,无论表达式是什么,类型。仅对基元和字符串例外。数组不是原始的。

当用作初始化器时,初始化表达式类型是已知的 - 与初始化变量类型相同。

于 2012-09-18T21:39:35.703 回答
0

数组类型变量的声明必须与初始化在同一语句中进行。喜欢long[] reservedFromIps = { /* ... */}。它是语法糖所必需的(我们可以用它来初始化一个数组{})。

例如以下应该工作 -

static { 
    reservedFromIps = new long[] {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  
}

原因如下

private static final long[] reservedFromIps = {0l, 167772160l, 1681915904l,  
    2130706432l, 2851995648l, 2886729728l, 3221225984l, 3227017984l, 3232235520l,  
    3323068416l, 3325256704l, 3405803776l, 3758096384l, 4026531840l, 4294967295l};  

有效是因为在这种情况下,数组的声明和初始化reservedFromIps在同一个语句中。

于 2012-09-18T21:33:11.230 回答