Java错误排行:50种常见bug及如何避免它们(一)
开发Java软件时会遇到很多类型的错误,但是大多数错误是可以避免的。编写代码时,有些错误是次要的失误,但这是很容易纠正的。如果您具有诸如Stackify Retrace之类的错误监视工具,则可以轻松编写代码。
在本文中,您将会找到:
- 50种最常见的Java软件错误
- 代码示例和教程可帮助您解决常见的编码问题
继续阅读以了解最常见的问题及其解决方法。
编译器错误
通过编译器运行Java软件代码时,将创建编译器错误消息。重要的是要记住,编译器可能会针对一个错误抛出许多错误的消息。因此,修复第一个错误并重新编译。那可以解决很多问题。
1.“……预期”
当代码中缺少某些内容时,将发生此错误。通常,这是由缺少分号或右括号引起的。
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.“未封闭的字符串文字”
当字符串文字结尾不带引号时,将创建“未封闭的字符串文字”错误消息,并且该消息将与错误显示在同一行。(@DreamInCode)文字是值的源代码。
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软件错误消息的讨论。(@Quora)
3.“非法表达”
发生“表达式的非法开头”错误的原因有很多,原因很多。它最终成为帮助较少的错误消息之一。一些开发人员说,这是由错误的代码引起的。
通常,创建表达式以产生新值或将值分配给变量。编译器期望找到一个表达式,但找不到该表达式,因为语法不符合期望。(@StackOverflow)在这些语句中可以找到错误。
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)
4.“找不到符号”
这是一个非常常见的问题,因为Java中的所有标识符都必须在使用前声明。在编译代码时,编译器无法理解标识符的含义。
您可能会收到“找不到符号”消息的原因有很多:
- 声明时标识符的拼写可能与在代码中使用标识符时的拼写不同。
- 该变量从未声明过。
- 变量未在声明的范围内使用。
- 该类未导入。
阅读有关“找不到符号”错误的详尽讨论,以及几个创建相同问题的代码示例。(@StackOverflow)
5.“公开课XXX应该在文件中”
当类XXX和Java程序文件名不匹配时,会出现“公共类XXX应该在文件中”消息。仅当类和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应该在文件中”错误的示例。(@堆栈溢出)
6.“不兼容的类型”
“不兼容的类型”是逻辑上的错误,当赋值语句试图将变量与类型的表达式配对时就会发生。当代码尝试将文本字符串放入整数时,通常会发生这种情况,反之亦然。这不是Java语法错误。(@StackOverflow)
test.java:78: error: incompatible types
return stringBuilder.toString();
^
required: int
found: String
1 error
当编译器给出“不兼容类型”消息时,确实没有一个简单的解决方法:
- 有一些可以转换类型的函数。
- 开发人员可能需要更改代码的预期功能。
查看一个示例,该示例说明如何尝试将字符串分配给整数,从而创建了“不兼容的类型”。 (@StackOverflow)
7.“无效的方法声明;返回类型为必填项”
此Java软件错误消息表示未在方法签名中明确声明方法的返回类型。
public class Circle
{
private double radius;
public CircleR(double r)
{
radius = r;
}
public diameter()
{
double d = radius * 2;
return d;
}
}
有几种方法可以触发“无效的方法声明”。返回类型为必填”错误:
- 忘记说明类型
- 如果该方法未返回值,则需要在方法签名中将“ void”声明为类型。
- 构造函数名称不需要声明类型。但是,如果构造函数名称中有错误,则编译器会将构造函数视为没有声明类型的方法。
跟随一个示例,说明构造函数命名是如何触发“无效的方法声明;返回类型为必填项”的问题。(@StackOverflow)
8.“类中的方法无法应用于给定类型”
此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.“遗失申报表”
当方法没有返回语句时,将出现“丢失的返回语句”消息。每个返回值(非空类型)的方法都必须具有一个从字面上返回该值的语句,以便可以在方法外部调用它。
public String[] OpenFile() throws IOException {
Map 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”消息的原因有两个:
- 一个return语句只是被错误地省略了。
- 该方法未返回任何值,但未在方法签名中声明void类型。
查看有关如何解决“ missing return statement” Java软件错误的示例。(@StackOverflow)
10.“可能会损失精度”
当分配给变量的信息超过了它可以容纳的范围时,就会发生“可能的精度损失”。如果发生这种情况,碎片将被扔掉。如果这很好,则代码需要将变量显式声明为新类型。
在以下情况下通常会发生“可能的精度损失”错误:
- 尝试将实数分配给具有整数数据类型的变量。
- 尝试将双精度型赋给具有整数数据类型的变量。
这在Java的基本数据类型说明显示数据是如何表征。(@甲骨文)
未完待续。。。。。。。。。。。。