Java常見錯誤列表:
·找不到符號(symbol)
·類X是public的,應(yīng)該被聲明在名為X.java的文件中
·缺失類、接口或枚舉類型
·缺失X
·缺失標識符
·非法的表達式開頭
·類型不兼容
·非法的方法聲明;需要返回類型
·數(shù)組越界(java.lang.ArrayIndexOutOfBoundsException)
·字符越界(java.lang.StringIndexOutOfBoundsException)
·類Y中的方法X參數(shù)不匹配
·缺少return語句
·精度損失
·在解析時到達了文件結(jié)尾
·執(zhí)行不到的語句
·變量沒被初始化
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;
此外,當你在代碼中引用一個方法但沒有在方法名后加上括號時也會報這個錯誤,加上括號用以表明引用的是個函數(shù),即使當函數(shù)沒有參數(shù)時也不能省略括號。例如:
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的變量,實際上,你是想調(diào)用一個叫做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
}
第三種情況,如果你忘記導入你所使用的包時也會出現(xiàn)這個錯誤。例如,考慮下面這個從用戶那里讀入一個整數(shù)的例子:
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)都是區(qū)分大小寫的。這就意味著,如果我們聲明了一個名為average的變量,然后在后面用Average引用它時,編譯器就會報找不到Average這個變量的錯誤。
2. 類X是public的,應(yīng)該被聲明在名為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. 缺失類、接口或枚舉類型
這個錯誤是一種與大括號有關(guān)的錯誤,一般來說,這個錯誤發(fā)生在程序最后有太多大括號時;例如:
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
一種找出這種錯誤的方式是正確的縮進代碼(因為這種錯誤總是與大括號有關(guān))。我們可以在Dr.java中按組合鍵CTRL-A(去選中這個程序),然后按TAB鍵(來正確地縮減代碼)。在我們上面的實例代碼中,程序的最后有兩個大括號,這在一個合法的程序中是不可能出現(xiàn)的。因此,我們僅僅去掉一個大括號就能夠讓程序正確的編譯。
1
public class Test {
2
public static void main(String[] args) {
3
System.out.println("Hello!");
4
}
5
}
4.缺失X
當編譯器檢查到代碼中缺失字符時會出現(xiàn)”缺失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.缺失標識符
當把代碼寫在了方法外時會出現(xiàn)這個錯誤;這種錯誤一般也是由大括號引起的。考慮下面的例子:
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
在這種情況下,很明顯第一個打印語句應(yīng)該放在main方法里面,這樣才能通過編譯。然而,當我們的程序中有多于一個方法并且大括號也不匹配時,這種“缺失標識符”的錯誤就不容易被發(fā)現(xiàn)了:
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”語句后就結(jié)束了,這樣打印“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
這里,缺少了一個關(guān)閉main方法大括號。由于main方法沒有被關(guān)閉,編譯器把調(diào)用my_method方法之后的代碼也當作main方法的一部分。然而,后面的代碼是public static void my_method() {,很顯然,這在一個方法內(nèi)不合法。
“非法的表達式開頭”這種錯誤不如我們上面提到的“××缺失”這種信息有幫助。對于這種錯誤(以及很多其他一些錯誤),非常有必要檢查一下出錯代碼前面的那幾行。對于上面那個例子,我們只需要在編譯器報錯的那行前面加上大括號關(guān)閉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.類型不兼容
當你的程序在處理類型相關(guān)的問題時會報這個錯。我們可以對一些類型進行相互轉(zhuǎn)化,例如,你可以輕松把一個char類型轉(zhuǎn)為int類型,反之亦然;你也可以通過向上轉(zhuǎn)型把一個double類型轉(zhuǎn)為int類型。但是,你不能把基本類型與像String這樣的對象進行相互轉(zhuǎn)換。例如:
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
一般來說,你不能像解決其他一些錯誤一樣解決這種錯誤。這不是一種語法錯誤,而是一種關(guān)于類型的邏輯錯誤。把一個String類型轉(zhuǎn)為int類型一般來說都是毫無意義。但是,在一些應(yīng)用中,你可能需要把String類型轉(zhuǎn)為int類型,比如,當這個字符串代碼一個數(shù)字時:
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這樣的類,這些基本類型的包裝類中有能接受字符串類型的參數(shù)的方法,這樣就把字符串類型轉(zhuǎn)為整型了:
1
public class Test {
2
public static void main(String[] args) {
3
int num = Integer.parseInt("500");
4
}
5
}
但是,這種解決“類型不兼容”錯誤的方案是一種例外,不是什么規(guī)則,因為這種錯誤一般來自于邏輯上的錯誤。
8.非法的方法聲明;需要返回類型
在Java中的每個方法都要求明確的聲明返回類型,即使這個方法什么也不返回,也要用void進行標識,就像main方法那樣。當一個方法沒有聲明返回類型時,會出現(xiàn)這種錯誤:
01
public class Test {
02
public static void main(String[] args) {
03