Java常见错误列表:
·找不到符号(symbol)
·类X是public的,应该被声明在名为X.java的文件中
·缺失类、接口或枚举类型
·缺失X
·缺失标识符
·非法的表达式开头
·类型不兼容
·非法的方法声明;需要返回类型
·数组越界(java.lang.ArrayIndexOutOfBoundsException)
·字符越界(java.lang.StringIndexOutOfBoundsException)
·类Y中的方法X参数不匹配
·缺少return语句
·精度损失
·在解析时到达了文件结尾
·执行不到的语句
·变量没被初始化
1. 找不到符号(symbol)
当你在代码中引用一个没有声明的变量时一般会报这个错误。考虑下面的例子:
01
public class Test {
02
public static void main(String[] args) {
03
int a = 3;
04
int b = 4;
05
int c = 20;
06
07
average = (a + b + c)/5.0;
08
System.out.println(average);
09
}
10
}
1 error found:
File: Test.java
Error: Test.java:7: cannot find
symbol
symbol : variable average
location: class Test
在上面的例子中,变量average没有被声明——也就是说你需要告诉编译器average的类型是什么,例如:
1
double average = (a +b + c)/5.0;
此外,当你在代码中引用一个方法但没有在方法名后加上括号时也会报这个错误,加上括号用以表明引用的是个函数,即使当函数没有参数时也不能省略括号。例如:
1
public class Test {
2
public static void main(String[] args) {
3
my_method;
4
}
5
6
public static void my_method() {
7
System.out.println("Hello, world!");
8
}
9
}
1 error found:
File: Test.java
Error: Test.java:7: cannot find
symbol
symbol : variable my_method
location: class Test
在上面的例子中,编译器在main方法中查找名为my_method的变量,实际上,你是想调用一个叫做my_method的方法:
1
public class Test {
2
public static void main(String[] args) {
3
my_method();
4
}
5
6
public static void my_method() {
7
System.out.println("Hello, world!");
8
}
9
}
第三种情况,如果你忘记导入你所使用的包时也会出现这个错误。例如,考虑下面这个从用户那里读入一个整数的例子:
1
public class Test {
2
public static void main(String[] args) {
3
Scanner console = new Scanner(System.in);
4
int n = console.nextInt();
5
}
6
}
2 errors found:
File:Test.java
Error: cannotfind
symbol
symbol: class Scanner
location:class Test
File:Test.java
Error: cannotfind
symbol
symbol: class Scanner
location:class Test
这里的问题是程序必须导入java.util.Scanner(或者java.util.)。否则,编译器不知道Scanner是什么类型。当你在处理文件的输入/输出时,如果忘记导入java.util.Arrays或者java.io.,也会遇到这个错误。
1
import java.util.*; // or --> import java.util.Scanner;
2
public class Test {
3
public static void main(String[] args) {
4
Scanner console = new Scanner(System.in);
5
int n = console.nextInt();
6
}
7
}
最后,当我们在使用大小敏感的变量名时也会遇到这个错误。Java中所有的标识符(identifiers)都是区分大小写的。这就意味着,如果我们声明了一个名为average的变量,然后在后面用Average引用它时,编译器就会报找不到Average这个变量的错误。
2. 类X是public的,应该被声明在名为X.java的文件中
在一个Java程序中,如果类名与文件名不匹配时会报这个错。例如,下面这个Foo.java程序:
1
public class Bar {
2
public static void main(String[] args) {
3
System.out.println("Hello, world!");
4
}
5
}
1 error found:
File: Foo.java
Error: class Bar is public, should bedeclared in
a file
named Bar.java
由于Foo与Bar不匹配,这段代码会编译失败。修改这个错误,我们既可以修改类名,也可以修改文件名。
3. 缺失类、接口或枚举类型
这个错误是一种与大括号有关的错误,一般来说,这个错误发生在程序最后有太多大括号时;例如:
1
public class Test {
2
public static void main(String[] args) {
3
System.out.println("Hello!");
4
}
5
}
6
}
1 error found:
File: Test.java
Error: class, interface, or enumexpected
一种找出这种错误的方式是正确的缩进代码(因为这种错误总是与大括号有关)。我们可以在Dr.java中按组合键CTRL-A(去选中这个程序),然后按TAB键(来正确地缩减代码)。在我们上面的实例代码中,程序的最后有两个大括号,这在一个合法的程序中是不可能出现的。因此,我们仅仅去掉一个大括号就能够让程序正确的编译。
1
public class Test {
2
public static void main(String[] args) {
3
System.out.println("Hello!");
4
}
5
}
4.缺失X
当编译器检查到代码中缺失字符时会出现”缺失X”这种形式的错误,错误信息会告诉你在哪行缺失了哪个字符,考虑下面的程序:
1
public class Test
2
public static void main(String[] args) {
3
my_method();
4
}
5
6
public static void my_method() {
7
System.out.println("Hello, world!")
8
}
9
}
2 errors found:
File: Test.java
Error: Test.java:1: '{'
expected
File:.java
Error: Test.java:7: ';'
expected
这个错误信息告诉你在第1行缺失了一个大括号,在第7行缺失了一个分号。解决这种错误很简单——只需把缺失的字符在正确的位置上补上即可。
1
public class Test {
2
public static void main(String[] args) {
3
my_method();
4
}
5
6
public static void my_method() {
7
System.out.println("Hello, world!");
8
}
9
}
5.缺失标识符
当把代码写在了方法外时会出现这个错误;这种错误一般也是由大括号引起的。考虑下面的例子:
1
public class Test {
2
System.out.println("Hello!");
3
4
public static void main(String[] args) {
5
System.out.println("World!");
6
}
7
}
2 errors found:
File: Test.java
Error:expected
File: Test.java
Error: illegal start of type
在这种情况下,很明显第一个打印语句应该放在main方法里面,这样才能通过编译。然而,当我们的程序中有多于一个方法并且大括号也不匹配时,这种“缺失标识符”的错误就不容易被发现了:
1
public class Test {
2
public static void main(String[] args) {
3
System.out.println("Hello!");}
4
System.out.println("World!");
5
}
6
}
3 errors found:
File: Test.java
Error:expected
File: Test.java
Error: illegal start of type
File: Test.java
Error: class, interface, or enumexpected
在上面的代码中多了一个大括号,但是因为代码没有正确的缩进,所以很难找出这个错误。这样使得main方法在打印“hello”语句后就结束了,这样打印“world”的语句就变成方法以外的代码了。修改这个错误的方式十分简单——只需要把第三行的大括号删除就可以了:
1
public class Test {
2
public static void main(String[] args) {
3
System.out.println("Hello!");
4
System.out.println("World!");
5
}
6
}
6.非法的表达式开头
当编译器遇到一条不合法的语句时会报“非法的表达式开头”这种错误。考虑下面的例子:
1
public class Test {
2
public static void main(String[] args) {
3
my_method();
4
5
6
public static void my_method() {
7
System.out.println("Hello, world!");
8
}
9
}
5 errors found:
File: Test.java
Error: Test.java:6: illegal start ofexpression
File: Test.java
Error: Test.java:6: illegal start ofexpression
File: Test.java
Error: Test.java:6: ';'
expected
File: Test.java
Error: Test.java:6: ';'
expected
File: Test.java
Error: Test.java:9: reached end of file
while
parsing
这里,缺少了一个关闭main方法大括号。由于main方法没有被关闭,编译器把调用my_method方法之后的代码也当作main方法的一部分。然而,后面的代码是public static void my_method() {,很显然,这在一个方法内不合法。
“非法的表达式开头”这种错误不如我们上面提到的“××缺失”这种信息有帮助。对于这种错误(以及很多其他一些错误),非常有必要检查一下出错代码前面的那几行。对于上面那个例子,我们只需要在编译器报错的那行前面加上大括号关闭main方法就可以了。重新编译,所有的错误都解决了。
1
public class Test {
2
public static void main(String[] args) {
3
my_method();
4
}
5
6
public static void my_method() {
7
System.out.println("Hello, world!");
8
}
9
}
7.类型不兼容
当你的程序在处理类型相关的问题时会报这个错。我们可以对一些类型进行相互转化,例如,你可以轻松把一个char类型转为int类型,反之亦然;你也可以通过向上转型把一个double类型转为int类型。但是,你不能把基本类型与像String这样的对象进行相互转换。例如:
1
public class Test {
2
public static void main(String[] args) {
3
int num = "Hello, world!";
4
}
5
}
1 error found:
File: Test.java
Error: Test.java:3: incompatible types
found : java.lang.String
required: int
一般来说,你不能像解决其他一些错误一样解决这种错误。这不是一种语法错误,而是一种关于类型的逻辑错误。把一个String类型转为int类型一般来说都是毫无意义。但是,在一些应用中,你可能需要把String类型转为int类型,比如,当这个字符串代码一个数字时:
1
public class Test {
2
public static void main(String[] args) {
3
int num = "500";
4
}
5
}
1 error found:
File: Test.java
Error: Test.java:3: incompatible types
found : java.lang.String
required: int
解决这种错误一般采用这样的方法:借助于Java中像Integer这样的类,这些基本类型的包装类中有能接受字符串类型的参数的方法,这样就把字符串类型转为整型了:
1
public class Test {
2
public static void main(String[] args) {
3
int num = Integer.parseInt("500");
4
}
5
}
但是,这种解决“类型不兼容”错误的方案是一种例外,不是什么规则,因为这种错误一般来自于逻辑上的错误。
8.非法的方法声明;需要返回类型
在Java中的每个方法都要求明确的声明返回类型,即使这个方法什么也不返回,也要用void进行标识,就像main方法那样。当一个方法没有声明返回类型时,会出现这种错误:
01
public class Test {
02
public static void main(String[] args) {
03