在开发 Java 软件时可能会遇到许多类型的错误,但大多数可以避免。 我们列举了 50 个最常见的 Java 软件错误,其中包含代码示例和教程,以帮助您解决常见的编码问题。
更多关于编写更好的 Java 程序的提示和技巧,请下载我们的“综合 Java 开发人员指南”,指南包含从工具到最好的网站及博客,YouTube 频道,有影响力的 Twitter,领英小组,播客,所有你需要用到的 Java 相关内容。
如果您正在使用 .NET,您还应该查看我们的 50 个最常见的 .NET 软件错误指南,以及如何避免这些错误。 如果您当前的挑战与 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; }
这种错误消息常常不会准确的定位到错误发生的位置。为了找到错误,建议:
确保所有的左括号有对应匹配的右括号。
(使用 IDE,译者注)在代码行前的提示中检查。这种 Java 软件错误不要由编译器来关注,应该把更后面的工作交给它。
有时候一个字符,比如一个左括号不应该写在 Java 代码的开始处。这样造成的结果是开发者不会写右括号去凑成一对。
对照这个“一个缺失的括号”的例子来制造一个错误。
“未封闭的 String 表达式”错误消息发生在 Sting 表达式结束时没有引号标记,错误消息将在发生错误的同一行提示出来。一个 String 表达式在源码中是一个值。
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"); } }
通常情况下,错误发生在:
String 表达式结束时没有使用引号标记。这种错误只要在 String 表达式结束是使用引号就能简单的改正
String 表达式超过一行时。长的 String 表达式可以被拆分成多个表达式,然后用 "+" 连接起来。
引号是 String 表达式中的元素又没有使用下划线“”进行转义。
出现“非法表达式开头”错误的原因有很多。但它最终归类于一个不太有用的错误消息之一。有些开发者说这是由糟糕的代码造成的。
通常,创建表达式是用于生成新值或为变量赋值。编译器期望找到一个表达式,但找不到它,因为语法不符合预期。 (@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 }
请浏览下这个讨论,关于如何解决“非法表达式开头”错误的方法 。 (@StackOverflow)
其它翻译版本 (1) 加载中这是一个非常常见的问题,因为 Java 中的所有标识符都需要在使用之前进行声明。 当编译代码时,编译器并不理解标识符的含义。
在你遇到“找不到符号”消息时可能有很多种原因:
标识符声明时的拼写可能与代码中使用时的拼写不同。
该变量从未被声明。
该变量使用的位置与其声明的作用域不同。
类并未被导入。
请通读关于“找不到符号”错误的讨论,其中也包含创建该问题的示例代码。(@StackOverflow)
“公共类 XXX 应该在文件中出现”这个消息出现在类XXX和Java程序文件名不一致时。源代码只有在类名和 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); } }
要修复这种情况:
类名和文件名一样。
确保这两个名字的大小写一致。
看 “公共类 XXX 应该在文件中出现”错误的例子。(@StackOverflow)
其它翻译版本 (1) 加载中“不兼容的类型”是在赋值语句中尝试将变量与类型表达式匹配时触发的逻辑错误。通常是在代码尝试将文本字符写入到整数中时出现,反之亦然。 这不是 Java 语法错误。 (@StackOverflow)
test.java:78: error: incompatible types return stringBuilder.toString(); ^ required: int found: String 1 error
当编译器给出“不兼容的类型”消息时,确实没有一个简单的修复方案:
有可以转换类型的函数。
开发人员可能需要按照代码的预期修改之。
看一个例子,来说明如何通过使用字符串到整型的赋值来创建"不兼容类型"错误。(@StackOverflow)
此错误表示方法签名中没有明确说明方法的返回类型。
public class Circle { private double radius; public CircleR(double r) { radius = r; } public diameter() { double d = radius * 2; return d; } }
有几种方式会触发“无效的方法声明; 需求返回类型“错误:
忘记说明返回类型
如果方法没有返回值,那么需要用“void”表示方法签名中的返回类型。
构造函数名称不需要说明返回类型。 但是,如果构造函数名称中出现错误,那么编译器会将构造函数视为没有指定类型的方法。
下面是一个例子讲述构造函数命名怎么触发“无效的方法声明;需求返回类型”的错误 。 (@StackOverflow)
此错误消息是 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)
当一个方法缺少返回语句时,会发生“缺少返回语句”错误。 每一个有返回值的方法(非 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!"); } }
下面列举了一些编译器抛出“缺少返回语句”的消息的原因:
返回语句被错误地省略了
一个方法没有返回任何值,但是在方法签名中没有声明为void类型
查看如何修复“缺少返回语句”的 Java 错误的示例(@StackOverflow)
其它翻译版本 (1) 加载中 本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务