Java 中的意外编译错误
Unexpected Compilation Error in Java
这是一个小代码,如果输入数组的长度是2的幂,那么段数组的大小是2*(input_array.length)-1 else 2*(next power of 2 after input_array.length)-1 .
public static int ByLogs(int n)
{
double y = Math.floor(Math.log(n)/Math.log(2));
return (int)Math.pow(2, y + 1);
}
public static void main(String [] args)
{
int input_array[] = {-1,2,4,0,3};
if(( input_array.length & (input_array.length - 1) == 0 ) && input_array.length > 0)
int [] segment_array = new int[2*(input_array.length)-1];
else
int [] segment_array = new int[2*(ByLogs(input_array.length))-1];
//Arrays.fill(segment_array,999);
System.out.println(segment_array.length);
}
但编译后出现如下错误
SegmentTree.java:17: error: '.class' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: illegal start of expression
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ']' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: illegal start of expression
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
我找不到我的错误。
if 语句有错误。
查看评论:
public static int ByLogs(int n)
{
double y = Math.floor(Math.log(n)/Math.log(2));
return (int)Math.pow(2, y + 1);
}
public static void main(String[] args)
{
int input_array[] = {-1,2,4,0,3};
int [] segment_array;
int n = input_array.length;
//for positive n
if( (n & (n - 1)) == 0 ) {
segment_array = new int[(2*(input_array.length))-1];
} else {
segment_array = new int[(2*(ByLogs(input_array.length)))-1];
}
//Arrays.fill(segment_array,999);
System.out.println(segment_array.length);
}
首先,您实际上不能在这样的 if 语句中声明变量,因为它会在块结束后立即退出 scope。所以代替:
if (...) {
int[] a = ...;
} else {
int[] a = ...;
}
你可能想要:
int[] a; // declare the variable first, *then* initialize it
if (...) {
a = ...;
} else {
a = ...;
}
其次,你的条件被破坏了; &
的左侧是 int
,而右侧是 boolean
。按位与运算符支持这两种类型,但不能一起使用;到 convert a boolean
to an int
你可以简单地明确地这样做,例如
((input_array.length - 1) == 0) ? 1 : 0
检查是否input_array.length
is a power of two你想要:
(input_array.length & (input_array.length - 1)) == 0
注意 -1
.
之后的额外闭括号
最后,您的语法很草率,这可能会使您的代码更难使用。尽管 Java 允许以多种形式声明数组(例如 int variable[]
、int [] variable
、int[] variable
),但只有最后一种形式是常用的。我强烈建议始终将您的数组声明为 type[] variableName
,即使您不必这样做。同样,在编写块(if
、else
、for
等)时始终使用 { }
,因为它使您的代码更易于阅读,并且将来修改起来更安全。
这是一个小代码,如果输入数组的长度是2的幂,那么段数组的大小是2*(input_array.length)-1 else 2*(next power of 2 after input_array.length)-1 .
public static int ByLogs(int n)
{
double y = Math.floor(Math.log(n)/Math.log(2));
return (int)Math.pow(2, y + 1);
}
public static void main(String [] args)
{
int input_array[] = {-1,2,4,0,3};
if(( input_array.length & (input_array.length - 1) == 0 ) && input_array.length > 0)
int [] segment_array = new int[2*(input_array.length)-1];
else
int [] segment_array = new int[2*(ByLogs(input_array.length))-1];
//Arrays.fill(segment_array,999);
System.out.println(segment_array.length);
}
但编译后出现如下错误
SegmentTree.java:17: error: '.class' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: illegal start of expression
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ']' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: illegal start of expression
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: not a statement
int [] segment_array = new int[2*(input_array.length)-1];
^
SegmentTree.java:17: error: ';' expected
int [] segment_array = new int[2*(input_array.length)-1];
我找不到我的错误。
if 语句有错误。
查看评论:
public static int ByLogs(int n)
{
double y = Math.floor(Math.log(n)/Math.log(2));
return (int)Math.pow(2, y + 1);
}
public static void main(String[] args)
{
int input_array[] = {-1,2,4,0,3};
int [] segment_array;
int n = input_array.length;
//for positive n
if( (n & (n - 1)) == 0 ) {
segment_array = new int[(2*(input_array.length))-1];
} else {
segment_array = new int[(2*(ByLogs(input_array.length)))-1];
}
//Arrays.fill(segment_array,999);
System.out.println(segment_array.length);
}
首先,您实际上不能在这样的 if 语句中声明变量,因为它会在块结束后立即退出 scope。所以代替:
if (...) {
int[] a = ...;
} else {
int[] a = ...;
}
你可能想要:
int[] a; // declare the variable first, *then* initialize it
if (...) {
a = ...;
} else {
a = ...;
}
其次,你的条件被破坏了; &
的左侧是 int
,而右侧是 boolean
。按位与运算符支持这两种类型,但不能一起使用;到 convert a boolean
to an int
你可以简单地明确地这样做,例如
((input_array.length - 1) == 0) ? 1 : 0
检查是否input_array.length
is a power of two你想要:
(input_array.length & (input_array.length - 1)) == 0
注意 -1
.
最后,您的语法很草率,这可能会使您的代码更难使用。尽管 Java 允许以多种形式声明数组(例如 int variable[]
、int [] variable
、int[] variable
),但只有最后一种形式是常用的。我强烈建议始终将您的数组声明为 type[] variableName
,即使您不必这样做。同样,在编写块(if
、else
、for
等)时始终使用 { }
,因为它使您的代码更易于阅读,并且将来修改起来更安全。