在开发Java软件时可能会遇到许多类型的错误,但大多数是可以避免的。
为此我们罗列了最常见的Java编码错误,以帮助大家解决常见的编码问题。
当Java软件代码通过编译器运行时,会创建编译器错误消息。
谨记编译器可能会针对一个错误抛出许多错误消息。所以得修复第一个错误并重新编译。这样做可以解决很多问题。
当代码中缺少某些东西时,会发生此错误。通常是因为缺少分号或右括号。
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代码的原先位置。所以开发人员没有放置一个右括号来平衡括号。
如果字符串文字结束时没有引号的话,会创建“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"); } }
通常,这种情况发生在:
字符串文字不以引号结尾。这很容易纠正,加上所需的引号,闭合字符串文字即可。
字符串文字扩展超过一行。长字符串文字可以分解成字符串文字,并加上加号(“+”)。
作为字符串文字一部分的引号不通过反斜杠(“\”)进行转义。
出现“Illegal Start of an Expression”错误的原因有很多,因此名列不太有用的错误消息之一,有些开发者甚至认为这是由坏的代码造成的。
通常,创建表达式是为了生成新的值或为变量分配值。编译器期望找到表达式,但因为语法不符合预期而找不到表达式。(@StackOverflow)在这些语句中就可以发现此错误。
} // ADD IT HERE public 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 }
这是一个非常常见的问题,因为Java中的所有标识符都需要在被使用之前进行声明。发生错误的原因在于编译代码时,编译器不明白标识符的含义。
可能收到“Cannot Find Symbol”信息的原因有很多:
标识符声明时的拼写可能与在代码中使用时的拼写不同。
变量从未被声明。
变量使用时与声明未在同一范围内。
类没有导入。
当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); } }
为解决这个问题:
类和文件命名相同。
确保两名称的情况一致。
“Incompatible Types”是指定语句尝试将变量与类型表达式配对时发生的逻辑错误。通常会在代码尝试将文本字符串放入到整型中时出现,反之亦然。这并非Java语法错误。(@StackOverflow)
test.java:78: error: incompatible typesreturn stringBuilder.toString(); ^required: intfound: String1 error
当编译器给出“Incompatible Types”消息时,就不是简单修复可以摆平的了:
有可以转换类型的函数。
开发人员可能需要更改代码预期的功能。
此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”声明为方法签名中的类型。
构造函数名称不需要声明类型。但是,如果构造函数名称中存在错误,那么编译器将会把构造函数视为没有指定类型的方法。
此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
调用的方法期待方法声明中定义的某些参数。检查方法声明并仔细调用,以确保它们是兼容的。
当一个方法没有返回语句时,就会出现“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在方法签名中未声明。
当更多的信息被分配给一个变量而超过它的容量,就会发生“Possible Loss of Precision”消息。如果出现这种情况,那么碎片就会被扔掉。如果这样没有关系,那么代码需要将变量显式声明为新的类型。
“Possible Loss of Precision”错误通常发生在:
尝试为整数数据类型的变量分配一个实数。
尝试为整数数据类型的变量分配一个double。
当程序缺少关闭大括号(“}”)时,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程序和适当的代码缩进可以更容易地找到这类遗漏的大括号。
当一个语句写在一个阻止它执行的地方时,就会发生“Unreachable statement”错误。通常它出现在中断或返回语句之后。
for(;;){ break; ... // unreachable statement}int i=1;if(i==1) ...else ... // dead code
通常简单地移动返回语句将修复错误。
当方法中声明的局部变量未初始化时,就会发生这种错误。它也会出现在没有初始值的变量是if语句组成部分的情况下。
int x;if (condition) { x = 5;}System.out.println(x); // x may not have been initialized
当操作符用于非定义中的类型时,就会出现此问题。
operator < cannot be applied to java.lang.Object,java.lang.Object
当Java代码尝试在计算中使用类型字符串时,通常会发生这种情况。要修复的话,就需要将字符串转换为整型或浮点型。
当Java代码尝试执行非法转换时,就会发生“Inconvertible Types”错误。
TypeInvocationConversionTest.java:12: inconvertible typesfound : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>required: java.util.ArrayList<java.lang.Class<?>> lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
例如,布尔值不能转换为整型。
当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
通常,有一个返回语句不返回任何东西。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!