常见的 Java 错误及避免方法
在開發Java軟件時可能會遇到許多類型的錯誤,但大多數是可以避免的。為此我們羅列了最常見的Java編碼錯誤,其中包含代碼示例和教程,以幫助大家解決常見的編碼問題。
編譯器錯誤
當Java軟件代碼通過編譯器運行時,會創建編譯器錯誤消息。謹記編譯器可能會針對一個錯誤拋出許多錯誤消息。所以得修復第一個錯誤并重新編譯。這樣做可以解決很多問題。
1.“…Expected”
當代碼中缺少某些東西時,會發生此錯誤。通常是因為缺少分號或右括號。
private static double volume(String solidom, double alturam, double areaBasem, double raiom) {double vol; if (solidom.equalsIgnoreCase("esfera"){vol=(4.0/3)*Math.pi*Math.pow(raiom,3);} else { if (solidom.equalsIgnoreCase("cilindro") {vol=Math.pi*Math.pow(raiom,2)*alturam;} else {vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;}} return vol; }通常,此錯誤消息不會精確確定問題的確切位置。為了找到錯誤:
確保所有的左括號都有一個對應的右括號。
在查看指示的Java代碼行之前順便看看行。此Java軟件錯誤沒有被編譯器注意到,直到在代碼中更深層次地查看。
有時一個字符,如一個左括號,并不應該放在Java代碼的原先位置。所以開發人員沒有放置一個右括號來平衡括號。
點擊查看關于錯誤的圓括號會如何導致錯誤(@StackOverflow)的示例。
2.“Unclosed String Literal”
如果字符串文字結束時沒有引號的話,會創建“Unclosed String Literal”的錯誤消息,并且消息將顯示在與錯誤相同的行上。(@DreamInCode)Literal是值的源代碼。
public abstract class NFLPlayersReference { private static Runningback[] nflplayersreference; private static Quarterback[] players; private static WideReceiver[] nflplayers; public static void main(String args[]){Runningback r = new Runningback("Thomlinsion");Quarterback q = new Quarterback("Tom Brady");WideReceiver w = new WideReceiver("Steve Smith");NFLPlayersReference[] NFLPlayersReference;Run();// {NFLPlayersReference = new NFLPlayersReference [3];nflplayersreference[0] = r;players[1] = q;nflplayers[2] = w; for ( int i = 0; i < nflplayersreference.length; i++ ) {System.out.println("My name is " + " nflplayersreference[i].getName());nflplayersreference[i].run();nflplayersreference[i].run();nflplayersreference[i].run();System.out.println("NFL offensive threats have great running abilities!");}}private static void Run() {System.out.println("Not yet implemented");} ? ? }通常。這種情況發生在:
字符串文字不以引號結尾。這很容易糾正,加上所需的引號,閉合字符串文字即可。
字符串文字擴展超過一行。長字符串文字可以分解成字符串文字,并加上加號(“+”)。
作為字符串文字一部分的引號不通過反斜杠(“\”)進行轉義。
點擊閱讀關于Java軟件錯誤消息Unclosed String Literal的討論。(@Quora)
3.“Illegal Start of an Expression”
出現“Illegal Start of an Expression”錯誤的原因有很多。因此名列不太有用的錯誤消息之一。有些開發者甚至認為這是由壞的代碼造成的。
通常,創建表達式是為了生成新的值或為變量分配值。編譯器期望找到表達式,但因為語法不符合預期而找不到表達式。(@StackOverflow)在這些語句中就可以發現此錯誤。
} // ADD IT HEREpublic void newShape(String shape) { switch (shape) { case "Line":Shape line = new Line(startX, startY, endX, endY);shapes.add(line); break; case "Oval":Shape oval = new Oval(startX, startY, endX, endY);shapes.add(oval); break; case "Rectangle":Shape rectangle = new Rectangle(startX, startY, endX, endY);shapes.add(rectangle); break; default:System.out.println("ERROR. Check logic.");}}} // REMOVE IT FROM HERE}點擊瀏覽關于如何排除“Illegal Start of an Expression”錯誤的討論。(@StackOverflow)
4.“Cannot Find Symbol”
這是一個非常常見的問題,因為Java中的所有標識符都需要在被使用之前進行聲明。 發生錯誤的原因在于編譯代碼時,編譯器不明白標識符的含義。
可能收到“Cannot Find Symbol”信息的原因有很多:
標識符聲明時的拼寫可能與在代碼中使用時的拼寫不同。
變量從未被聲明。
變量使用時與聲明未在同一范圍內。
類沒有導入。
點擊閱讀有關“Cannot Find Symbol”錯誤的詳細討論以及產生此問題的代碼示例。(@StackOverflow)
5.“Public Class XXX Should Be in File”
當XXX類和Java程序文件名不匹配時,會發生“Public Class XXX Should Be in File”消息。只有當類和Java文件相同時,代碼才會被編譯。(@coderanch):
package javaapplication3; public class Robot { int xlocation; int ylocation; String name; static int ccount = 0; public Robot(int xxlocation, int yylocation, String nname) { xlocation = xxlocation; ylocation = yylocation; name = nname; ccount++; } } public class JavaApplication1 { public static void main(String[] args) { robot firstRobot = new Robot(34,51,"yossi"); System.out.println("numebr of robots is now " + Robot.ccount); }}為解決這個問題:
類和文件命名相同。
確保兩名稱的情況一致。
點擊查閱“Public Class XXX Should Be in File”錯誤的示例。(@StackOverflow)
6.“Incompatible Types”
“Incompatible Types”是指定語句嘗試將變量與類型表達式配對時發生的邏輯錯誤。 通常會在代碼嘗試將文本字符串放入到整型中時出現,反之亦然。這并非Java語法錯誤。(@StackOverflow)
test.java:78: error: incompatible typesreturn stringBuilder.toString();^required: int found: String1 error當編譯器給出“Incompatible Types”消息時,就不是簡單修復可以擺平的了:
有可以轉換類型的函數。
開發人員可能需要更改代碼預期的功能。
查看此例子,里面說明了如何試著將一個字符串分配給一個整數,出現“Incompatible Types”消息。(@StackOverflow)
7.“Invalid Method Declaration; Return Type Required”
此Java軟件錯誤消息表示方法簽名中未明確聲明方法的返回類型。
public class Circle{ private double radius; public CircleR(double r){radius = r;} public diameter(){ double d = radius * 2; return d;} }有若干途徑會觸發“Invalid Method Declaration; Return Type Required” 錯誤:
忘記聲明類型
如果方法沒有返回值,那么需要將“void”聲明為方法簽名中的類型。
構造函數名稱不需要聲明類型。 但是,如果構造函數名稱中存在錯誤,那么編譯器將會把構造函數視為沒有指定類型的方法。
查看此說明構造函數命名如何觸發“Invalid Method Declaration; Return Type Required” 問題的例子。(@StackOverflow)
8.“Method <X> in Class <Y> Cannot Be Applied to Given Types”
此Java軟件錯誤消息是比較有用的錯誤消息之一。 它解闡明了方法簽名正在調用錯誤的參數。
RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;generateNumbers(); required: int[] found:generateNumbers(); reason: actual and formal argument lists differ in length調用的方法期待方法聲明中定義的某些參數。檢查方法聲明并仔細調用,以確保它們是兼容的。
查看此討論,里面說明了Java軟件錯誤消息如何識別在方法聲明和方法調用中由參數創建的不兼容性。(@StackOverflow)
9.“Missing Return Statement”
當一個方法沒有返回語句時,就會出現“Missing Return Statement”的消息。每個返回值(非void類型)的方法都必須有一個字面上返回該值的語句,以便在方法之外調用它。
public String[] OpenFile() throws IOException { Map<String, Double> map = new HashMap();FileReader fr = new FileReader("money.txt");BufferedReader br = new BufferedReader(fr); try{ while (br.ready()){ String str = br.readLine(); String[] list = str.split(" ");System.out.println(list); }} catch (IOException e){System.err.println("Error - IOException!");} }編譯器拋出“Missing Return Statement”消息的原因有若干:
返回語句由于錯誤被省略。
該方法沒有返回任何值,但類型void在方法簽名中未聲明。
查看如何修復“Missing Return Statement”Java軟件錯誤的示例。(@StackOverflow)
10.“Possible Loss of Precision”
當更多的信息被分配給一個變量而超過它的容量,就會發生“Possible Loss of Precision”消息。如果出現這種情況,那么碎片就會被扔掉。 如果這樣沒有關系,那么代碼需要將變量顯式聲明為新的類型。
“Possible Loss of Precision”錯誤通常發生在:
嘗試為整數數據類型的變量分配一個實數。
嘗試為整數數據類型的變量分配一個double。
此Java中基本數據類型的解釋表述了數據特征。(@Oracle)
11.“Reached End of File While Parsing”
當程序缺少關閉大括號(“}”)時,Java代碼中就會發生此錯誤消息。 有時我們可以通過在代碼的末尾放置大括號來快速修復錯誤。
public class mod_MyMod extends BaseModpublic String Version(){ return "1.2_02"; }public void AddRecipes(CraftingManager recipes){recipes.addRecipe(new ItemStack(Item.diamond), new Object[] { "#", Character.valueOf('#'), Block.dirt}); }上述代碼將導致以下錯誤:
java:11: reached end of file while parsing }編寫utilities程序和適當的代碼縮進可以更容易地找到這類遺漏的大括號。
此示例表述了缺少了大括號會如何創建“Reached End of File While Parsing”的錯誤消息。(@StackOverflow)
12.“Unreachable Statement”
當一個語句寫在一個阻止它執行的地方時,就會發生“Unreachable statement”錯誤。通常它出現在中斷或返回語句之后。
for(;;){ break;... // unreachable statement}int i=1;if(i==1)...else... // dead code通常簡單地移動返回語句將修復錯誤。閱讀關于如何修復Unreachable Statement Java軟件錯誤的討論。 (@StackOverflow)
13.“Variable <X> Might Not Have Been Initialized”
當方法中聲明的局部變量未初始化時,就會發生這種錯誤。它也會出現在沒有初始值的變量是if語句組成部分的情況下。
int x;if (condition) {x = 5; } System.out.println(x); // x may not have been initialized閱讀此關于如何避免觸發“Variable <X> Might Not Have Been Initialized”錯誤的討論。(@reddit)
14.“Operator … Cannot be Applied to <X>”
當操作符用于非定義中的類型時,就會出現此問題。
operator < cannot be applied to java.lang.Object,java.lang.Object當Java代碼嘗試在計算中使用類型字符串時,通常會發生這種情況。 要修復的話,就需要將字符串轉換為整型或浮點型。
閱讀此說明非數字類型如何導致Java軟件錯誤從而警報操作符無法應用于類型的例子。 (@StackOverflow)
15.“Inconvertible Types”
當Java代碼嘗試執行非法轉換時,就會發生“Inconvertible Types”錯誤。
TypeInvocationConversionTest.java:12: inconvertible types found : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>> required: java.util.ArrayList<java.lang.Class<?>>lessRestrictiveClassList = (ArrayList<Class<?>>) classList;例如,布爾值不能轉換為整型。
閱讀此關于如何在Java軟件中轉換不可轉換的類型的討論。(@StackOverflow)
16.“Missing Return Value”
當return語句包含不正確的類型時,你將收到“Missing Return Value”的消息。例如,以下代碼:
public class SavingsAcc2 { private double balance; private double interest; public SavingsAcc2() {balance = 0.0;interest = 6.17;} public SavingsAcc2(double initBalance, double interested) {balance = initBalance;interest = interested;} public SavingsAcc2 deposit(double amount) {balance = balance + amount; return;} public SavingsAcc2 withdraw(double amount) {balance = balance - amount; return;} public SavingsAcc2 addInterest(double interest) {balance = balance * (interest / 100) + balance; return;} public double getBalance() { return balance;} }返回以下錯誤:
SavingsAcc2.java:29: missing return value return; ^ SavingsAcc2.java:35: missing return value return; ^ SavingsAcc2.java:41: missing return value return; ^ 3 errors通常,有一個返回語句不返回任何東西。
轉載:
譯文鏈接:http://www.codeceo.com/article/50-java-errors-part-1.html
英文原文:50 Common Java Errors and How to Avoid Them (Part 1)
翻譯作者:碼農網?– 小峰
總結
以上是生活随笔為你收集整理的常见的 Java 错误及避免方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos2D场景编辑器
- 下一篇: 微信h5网页关闭分享以及关闭当前页面