原文:50 Common Java Errors and How to Avoid Them (Part 1)
作者:Angela Stringfellow
翻译:雁惊寒

译者注:本文介绍了20个常见的Java编译器错误,每种错误都包含了代码片段、问题说明,并给出了相关的链接来帮助你快速地理解并解决这些问题。以下是译文。

在开发Java软件的时候可能会遇到很多类型的错误,但大多数可以避免。我们精心挑选了20个最常见的Java软件错误,包含了代码示例和教程,以帮助你解决一些常见的编码问题。

要获得更多编写Java程序的提示和技巧,你可以下载我们的“Comprehensive Java Developer’s Guide”这本书,它里面包含了所有你需要的东西,从各类工具到最佳网站和博客、YouTube频道、Twitter影响者、LinkedIn组、播客、must-attend events等等。

如果你正在使用.NET,你应该阅读我们的50个最常见的.NET软件错误指南,以避免出现这些错误。但是如果你当前遇到的挑战是与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代码的第一个。

实例:一个丢失的圆括号引发的错误。

2. “Unclosed String Literal”

当字符串结尾缺少引号时,会产生“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”

出现“Illegal Start of an Expression”错误的原因有很多。它已经成为不太有用的错误消息之一。一些开发者认为这是由坏的代码味道造成的。

通常,创建一个表达式是为了生成一个新值或给其他变量赋值。编译器期望找到一个表达式,但是因为语法不符合预期而找不到表达式。在下面这些代码中可以找到这种错误。

} // 把它添加到这里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.");}}} // 从这里删掉它}

请阅读这篇文章:如何排除“illegal start of an expression”错误。

4. “Cannot Find Symbol”

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

有很多原因可能会产生“cannot find symbol”错误信息:

  • 标识符声明时的拼写可能与代码中使用时的拼写不一致。
  • 变量从未被声明。
  • 未在同一作用域内声明该变量。
  • 没有导入类。

请阅读这篇文章:关于“cannot find symbol”错误的讨论。

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

要解决这个问题,可以:

  • 把类和文件命名为相同的名字。
  • 确保两个名称始终保持一致。

请阅读这篇文章:“Public class XXX should be in file”错误的示例。

6. “Incompatible Types”

“Incompatible Types”是赋值语句尝试对变量与表达式进行类型匹配时发生的逻辑错误。通常,将字符串赋值给一个整数时会产生这个错误,反之亦然。这不是一个Java语法错误。

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

当编译器抛出“incompatible types”消息时,确实不太容易解决这个问题:

  • 使用类型转换函数。
  • 开发人员可能需要修改代码原有的功能。

看一下这个例子:将一个字符串赋值给整数会出现“incompatible types”错误。

7. “Invalid Method Declaration; Return Type Required”

这个错误消息的意思是,在方法声明中未显示地声明方法的返回类型。

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“问题。

8. “Method in Class Cannot Be Applied to Given Types”

这个错误消息比较有用,它的意思是某个方法调用了错误的参数。

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错误。

9. “Missing Return Statement”

当一个方法缺少return语句时,会触发“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”错误这个例子。

10. “Possible Loss of Precision”

当赋值给变量的信息超过了该变量可以承载的上限时,就会触发“Possible Loss of Precision”错误。一旦发生这种情况,部分信息将被丢弃。如果这样做没问题的话,那么在代码上应该将变量显式地声明为新的类型。

以下情况通常会发生“possible loss of precision”错误:

  • 尝试将一个实数赋值给整型类型的变量。
  • 尝试将一个double数据赋值给整型类型的变量。

Java中的基本数据类型解释了不同数据类型的特点。

11. “Reached End of File While Parsing”

这个错误消息通常在程序缺少右大括号(“}”)时触发。有时,在代码的末尾增加右大括号可以快速地修复此错误。

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 }

编码工具和适当的代码缩进可以更容易地找到这些不匹配的大括号。

请阅读这篇文章:缺少的大括号会触发“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语句即可修复此错误。请阅读这篇文章:如何修复“Unreachable Statement”错误。

13. “Variable Might Not Have Been Initialized”

在方法中声明的局部变量如果没有初始化,就会发生这种错误。如果在if语句中包含没有初始值的变量时,就会发生这种错误。

int x;
if (condition) {x = 5;
}
System.out.println(x); // x可能尚未初始化

请阅读这篇文章:如何避免触发“Variable Might Not Have Been Initialized”错误。

14. “Operator … Cannot be Applied to ”

当操作符作用于未在其定义范围内的类型时,会出现此问题。

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

当Java代码尝试在计算(减法、乘法、大小比较等)中使用字符串类型时,经常会触发这种错误。要修复这个问题,需要将字符串转换为整数或浮点数。

请阅读这篇文章:非数字类型为什么会导致Java软件错误。

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软件中转换不可转换的类型。

16. “Missing Return Value”

当返回语句包含不正确的类型时,你会收到“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

通常,这个错误的出现是因为有某个返回语句没有返回任何东西。

请阅读这篇文章:如何避免“Missing Return Value”错误。

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

通常,更改方法的返回类型与返回语句中的类型一致,可以解决这个问题。例如,下面的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;
}

请阅读这篇文章:如何修复“Cannot Return a Value From Method Whose Result Type Is Void”错误。

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

要解决“Non-Static Variable … 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) Not Initialized”

当数组已经声明但未初始化时,你会得到“(array) Not Initialized”这样的错误消息。数组的长度是固定的,因此每个数组都需要以所需的长度进行初始化。

以下代码是正确的:

AClass[] array = {object1, object2}

这样也可以:

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

但这样是不正确的:

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

请阅读这篇文章:关于如何在Java中初始化数组。

未完待续

今天我们讨论了编译器的错误,下次我们将深入讨论各种可能会出现的运行时异常。像本文的结构一样,下次也会包含代码片段、解释,以及相关的链接来帮助你尽快修复代码。

20个常见的Java错误以及规避方法相关推荐

  1. 常见的 Java 错误及避免方法

    在开发Java软件时可能会遇到许多类型的错误,但大多数是可以避免的.为此我们罗列了最常见的Java编码错误,其中包含代码示例和教程,以帮助大家解决常见的编码问题. 编译器错误 当Java软件代码通过编 ...

  2. 开机启动失败_电脑常见开机引导错误的解决方法

    电脑在开机启动过程中,经常会出现开机失败的故障,开机失败比较常出现在开机引导项错误的问题上,比如引导文件没了,硬盘有问题等等,有些小问题重启几遍可以解决,有些问题就只能修复.这边小编跟大家整理分享几个 ...

  3. 50个常见的 Java 错误(第三部分)

    31."Could Not Create Java Virtual Machine" 当我们尝试调用带有错误参数的Java代码时,通常会产生此Java错误消息(@ghacksnew ...

  4. 20道常见的Java面试题,你一定有遇到过

    Java是一门广泛应用于企业级开发的编程语言,在企业级应用开发中占据着重要的地位.因此,Java面试题也成为了企业招聘中必备的部分.在面试中,Java面试题会考察应聘者的对Java语言和相关技术的掌握 ...

  5. 常见的数据库错误的解决方法!必看!(含安装插件常见错误)

    这里所说的是MySQL Query Error提示错误的解决方法,部分是完全可以自己动手解决的,没有多大必要一遍遍问.除非是常规方法不能解决的~ 下面是常见安装插件会出现的数据库错误信息提示: [Co ...

  6. 20道常见初级Java面试题

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...

  7. sql常见语法_常见SQL语法错误以及解决方法

    sql常见语法 SQL Server Management Studio, errors can be tracked down easily, using the built in 错误列表&quo ...

  8. java错误1601解决方法,未知错误1601解决方法

    在使用iTunes进行刷机升级时,网友很可能会遇到各种各样的问题.面对它们,很多网友都很迷惑,如何去解决?pc6在此为大家收集了常见的错误以及解决办法,希望对大家有一定帮助.以下是针对使用iTunes ...

  9. matlab java错误_Matlab启动时大量java错误的处理方法

    标签: MATLAB的Tech Notes,解决方案如下: Solution: This exception indicates there was a problem reading an XML ...

最新文章

  1. STM32中stm32f0xx_flash.icf文件的作用详解!
  2. maven整合S2SH
  3. dbcc dbreindex server sql_SQL Server性能的提高,可通过DBCC DBREINDEX重建索引
  4. Java成神之路——CGLIB使用
  5. python中变量通过变量名访问_如何在python中访问给定变量的名称?
  6. 哈希表、哈希桶(C++实现)
  7. P2627 [USACO11OPEN]Mowing the Lawn G (单调队列优化dp)
  8. ASP.NET 安全认证(二)
  9. python大鱼吃小鱼程序代码_pygame大鱼吃小鱼源代码
  10. 短信宝接入发送短信实测 Java
  11. CMD常用命令大全(old)
  12. 保时捷狂推NFT,高调喊出打造Web3社区,Web2品牌“天生缺陷”终将折戟沉沙?...
  13. 只能写作文?那必须安排一条龙服务[ChatGPT的应用场景初探]
  14. java object取数据_java使用ObjectInputStream从文件中读取对象
  15. Kafka创建Topic的两种方式
  16. 4c钻石净度魔术语言,钻戒4c什么意思?详解钻石4C的秘密
  17. python常用字体显示方框_中文变小框框?深入剖析matplotlib的字体逻辑
  18. vivo深度学习AI算法面试
  19. 如何构建阿里API请求数据
  20. 上海通联支付java面试_通联支付面试经验

热门文章

  1. 谷歌最好的程序员Jeff Dean:我用过 18 种编程语言
  2. MSSTDFMT.dll系统文件(附2种MSSTDFMT.dll 注册方法)-系统增强
  3. 从几百个生产环境总结出的Redis性能问题排查解决手册(值得收藏)
  4. 解决网页直接上传mov格式视频
  5. python程序设计杨柏林pdf_Python程序设计教程 PDF 下载
  6. 如何用命令行启动Redis
  7. 你一定要收藏的全网最完整CAD快捷键大全!三
  8. 一调计算机专业综合理论试卷,2013一调计算机专业综合理论试卷(盐城).doc
  9. linux7 掉电,设置RHEL7电源按钮的行为
  10. tensorflow的sess.run的参数执行顺序