百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

50个常见 Java 错误以及如何避免它们

toyiye 2024-06-30 09:59 10 浏览 0 评论


在开发 Java 软件时可能会遇到许多类型的错误,但大多数都是可以避免的。我们收集了 50 个最常见的 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 代码中。所以开发者没有放置所谓括号来平衡括号。

2. “Unclosed String 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");
    }     
}

通常,这种情况会发生在:

字符串文字以引号结尾。这很容易通过用所需的引号关闭字符串文字来更正。

字符串字面量超出一行。长字符串文字可以分解为多个文字并用加号 (“+”) 连接。

作为字符串文字一部分的引号不会使用反斜杠 (“\”) 进行转义。

3. “Illegal Start of an Expression”

出现“非法开始表达式”错误的原因有很多。它最终成为不太有用的错误消息之一。一些开发人员说这是由错误的代码引起的。

通常,创建表达式是为了产生新值或为变量赋值。编译器希望找到一个表达式,但由于语法与预期不匹配而无法找到它。

} // 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
    }

4. “Cannot Find Symbol”

这是一个非常常见的问题,因为 Java 中间的所有标识符都需要在使用之前进行声明。在编译代码时,编译器不能理解标识符的含义。

您可能会收到“找不到符号”的消息的原因有很多:

声明时标识符的拼写可能与在代码中使用时的拼写不同。

该变量从未被声明。

该变量未在声明的同一范围内使用。

该类未导入。

5. “Public Class XXX Should Be in File”

当类 XXX 和 Java 程序文件名不匹配时,会出现“public class XXX should be in file”消息。只有在类和 Java 文件相同时才会编译代码。

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);  
    }
  }

要解决此问题:

命名类和文件类相同。

确保两个名称的大小写一致。

6. “Incompatible Types”

“类型不兼容”是当赋值语句试图将变量与类型表达式配对时发生的逻辑错误。当代码试图将文本字符串放入整数时,通常会出现这种情况——反之亦然。这不是 Java 语法错误。

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found:    String
1 error

当编译器给出“不兼容的类型”消息时,确实没有一个简单的解决方法:

有可以转换类型的函数。

开发人员可能需要更改代码预期执行的操作。

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;
    }
}

有几种方法可以触发“无效方法声明;需要返回类型”错误:

忘记说明类型

如果该方法没有返回值,则需要在方法签名中将“void”声明为类型。

构造函数名称不需要说明类型。但是如果构造函数名称有错误,那么编译器会将构造函数视为没有声明类型的方法。

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

被调用的方法需要在方法声明中定义的某些参数。检查方法声明并仔细调用以确保它们兼容。

9. “Missing Return Statement”

当方法没有 return 语句时,会出现“missing return statement”消息。每个返回值(非空类型)的方法都必须有一个真正返回该值的语句,以便可以在方法外调用它。

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”消息的原因有几个:

return 语句只是被错误地省略了。

该方法未返回任何值,但未在方法签名中声明类型 void。

10. “Possible Loss of Precision”

当分配给变量的信息超过其所能容纳的信息时,就会发生“可能的精度损失”。如果发生这种情况,碎片将会被扔掉。如果这没问题,那么代码需要将变量显式声明为新类型。

“可能的精度损失”错误通常发生在:

尝试将实数分配给具有整数数据类型的变量。

尝试为具有整数数据类型的变量分配双精度值。

11. “Reached End of File While Parsing”

当程序缺少右花括号(“}”)时,Java 中通常会出现此错误消息。有时可以通过将其放在代码末尾来快速修复。

public class mod_MyMod extends BaseMod
public 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 }

编码实用程序和适当的代码缩进可以更容易地找到这些不平衡的大括号。

12. “Unreachable Statement”

当一个语句写在一个阻止它被执行的地方时,就会发生“Unreachable statement”。通常,这是在 break 或 return 语句之后。

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

通常只需移动 return 语句即可修复错误。

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

14. “Operator ... Cannot be Applied to <X>”

当运算符用于不在其定义中的类型时,会出现此问题。

operator < cannot be applied to java.lang.Object,java.lang.Object

当 Java 代码尝试在计算中使用类型字符串时,通常会发生这种情况。要修复它,需要将字符串转换为整数或浮点数。

15. “Inconvertible Types”

当 Java 代码尝试执行非法转换时,会发生“不可转换类型”错误。

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;

例如,布尔值不能转换为整数。

16. “Missing Return Value”

当 return 语句包含不正确的类型时,您将收到“缺少返回值”消息。例如,以下代码:

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

通常,有一个不返回任何内容的 return 语句。

17. “Cannot Return a Value From Method Whose Result Type Is Void”

当 void 方法尝试返回任何值时,会发生此 Java 错误,例如在以下示例中:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

通常通过更改方法签名以匹配 return 语句中的类型来解决此问题。在这种情况下,void 的实例可以更改为 int:

public static int move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}

18. “Non-Static Variable ... Cannot Be Referenced From a Static Context”

public class StaticTest {
    private int count=0;
    public static void main(String args[]) throws IOException {
        count++; //compiler error: non-static variable count cannot be referenced from a static context
    }
}

要修复“非静态变量...无法从静态上下文中引用”错误,可以做两件事:

该变量可以在签名中声明为静态。

代码可以在静态方法中创建非静态对象的实例。

19. “Non-Static Method ... Cannot Be Referenced From a Static Context”

当 Java 代码尝试调用非静态类中的非静态方法时,会出现此问题。例如,以下代码:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

会返回这个错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Cannot make a static reference to the non-static method getAge() from the type Sample

从静态方法调用非静态方法就是声明一个调用非静态方法的类的实例。

20. “(array) <X> Not Initialized”

当数组已声明但未初始化时,您将收到“(array) <X> not initialized”消息。数组的长度是固定的,因此每个数组都需要使用所需的长度进行初始化。

以下代码是可以接受的:

AClass[] array = {object1, object2}

原样:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

但这样是不行的

AClass[] array;
...
array = {object1, object2};

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码