50个常见的 Java 错误及避免方法(第一部分)

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

编译器错误

当Java软件代码通过编译器运行时,会创建编译器错误消息。谨记编译器可能会针对一个错误抛出许多错误消息。所以得修复第一个错误并重新编译。这样做可以解决很多问题。

1.“…Expected”

当代码中缺少某些东西时,会发生此错误。通常是因为缺少分号或右括号。

通常,此错误消息不会精确确定问题的确切位置。为了找到错误:

  • 确保所有的左括号都有一个对应的右括号。
  • 在查看指示的Java代码行之前顺便看看行。此Java软件错误没有被编译器注意到,直到在代码中更深层次地查看。
  • 有时一个字符,如一个左括号,并不应该放在Java代码的原先位置。所以开发人员没有放置一个右括号来平衡括号。

点击查看关于错误的圆括号会如何导致错误(@StackOverflow)的示例

2.“Unclosed String Literal”

如果字符串文字结束时没有引号的话,会创建“Unclosed String Literal”的错误消息,并且消息将显示在与错误相同的行上。(@DreamInCode)Literal是值的源代码。

通常。这种情况发生在:

  • 字符串文字不以引号结尾。这很容易纠正,加上所需的引号,闭合字符串文字即可。
  • 字符串文字扩展超过一行。长字符串文字可以分解成字符串文字,并加上加号(“+”)。
  • 作为字符串文字一部分的引号不通过反斜杠(“\”)进行转义。

点击阅读关于Java软件错误消息Unclosed String Literal的讨论。(@Quora)

3.“Illegal Start of an Expression”

出现“Illegal Start of an Expression”错误的原因有很多。因此名列不太有用的错误消息之一。有些开发者甚至认为这是由坏的代码造成的。

通常,创建表达式是为了生成新的值或为变量分配值。编译器期望找到表达式,但因为语法不符合预期而找不到表达式。(@StackOverflow)在这些语句中就可以发现此错误。

点击浏览关于如何排除“Illegal Start of an Expression”错误的讨论。(@StackOverflow)

4.“Cannot Find Symbol”

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

可能收到“Cannot Find Symbol”信息的原因有很多:

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

点击阅读有关“Cannot Find Symbol”错误的详细讨论以及产生此问题的代码示例。(@StackOverflow)

5.“Public Class XXX Should Be in File”

当XXX类和Java程序文件名不匹配时,会发生“Public Class XXX Should Be in File”消息。只有当类和Java文件相同时,代码才会被编译。(@coderanch):

为解决这个问题:

  • 类和文件命名相同。
  • 确保两名称的情况一致。

点击查阅“Public Class XXX Should Be in File”错误的示例。(@StackOverflow)

6.“Incompatible Types”

“Incompatible Types”是指定语句尝试将变量与类型表达式配对时发生的逻辑错误。 通常会在代码尝试将文本字符串放入到整型中时出现,反之亦然。这并非Java语法错误。(@StackOverflow)

当编译器给出“Incompatible Types”消息时,就不是简单修复可以摆平的了:

  • 有可以转换类型的函数。
  • 开发人员可能需要更改代码预期的功能。

查看此例子,里面说明了如何试着将一个字符串分配给一个整数,出现“Incompatible Types”消息。(@StackOverflow)

7.“Invalid Method Declaration; Return Type Required”

此Java软件错误消息表示方法签名中未明确声明方法的返回类型。

有若干途径会触发“Invalid Method Declaration; Return Type Required” 错误:

  • 忘记声明类型
  • 如果方法没有返回值,那么需要将“void”声明为方法签名中的类型。
  • 构造函数名称不需要声明类型。 但是,如果构造函数名称中存在错误,那么编译器将会把构造函数视为没有指定类型的方法。

查看此说明构造函数命名如何触发“Invalid Method Declaration; Return Type Required” 问题的例子。(@StackOverflow)

8.“Method <X> in Class <Y> Cannot Be Applied to Given Types”

此Java软件错误消息是比较有用的错误消息之一。 它解阐明了方法签名正在调用错误的参数。

调用的方法期待方法声明中定义的某些参数。检查方法声明并仔细调用,以确保它们是兼容的。

查看此讨论,里面说明了Java软件错误消息如何识别在方法声明和方法调用中由参数创建的不兼容性。(@StackOverflow)

9.“Missing Return Statement”

当一个方法没有返回语句时,就会出现“Missing Return Statement”的消息。每个返回值(非void类型)的方法都必须有一个字面上返回该值的语句,以便在方法之外调用它。

编译器抛出“Missing Return Statement”消息的原因有若干:

  • 返回语句由于错误被省略。
  • 该方法没有返回任何值,但类型void在方法签名中未声明。

查看如何修复“Missing Return Statement”Java软件错误的示例。(@StackOverflow)

10.“Possible Loss of Precision”

当更多的信息被分配给一个变量而超过它的容量,就会发生“Possible Loss of Precision”消息。如果出现这种情况,那么碎片就会被扔掉。 如果这样没有关系,那么代码需要将变量显式声明为新的类型。

“Possible Loss of Precision”错误通常发生在:

  • 尝试为整数数据类型的变量分配一个实数。
  • 尝试为整数数据类型的变量分配一个double。

Java中基本数据类型的解释表述了数据特征。(@Oracle)

11.“Reached End of File While Parsing”

当程序缺少关闭大括号(“}”)时,Java代码中就会发生此错误消息。 有时我们可以通过在代码的末尾放置大括号来快速修复错误。

上述代码将导致以下错误:

编写utilities程序和适当的代码缩进可以更容易地找到这类遗漏的大括号。

示例表述了缺少了大括号会如何创建“Reached End of File While Parsing”的错误消息。(@StackOverflow)

12.“Unreachable Statement”

当一个语句写在一个阻止它执行的地方时,就会发生“Unreachable statement”错误。通常它出现在中断或返回语句之后。

通常简单地移动返回语句将修复错误。阅读关于如何修复Unreachable Statement Java软件错误的讨论。 (@StackOverflow)

13.“Variable <X> Might Not Have Been Initialized”

当方法中声明的局部变量未初始化时,就会发生这种错误。它也会出现在没有初始值的变量是if语句组成部分的情况下。

阅读此关于如何避免触发“Variable <X> Might Not Have Been Initialized”错误的讨论。(@reddit)

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

当操作符用于非定义中的类型时,就会出现此问题。

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

阅读此说明非数字类型如何导致Java软件错误从而警报操作符无法应用于类型的例子。 (@StackOverflow)

15.“Inconvertible Types”

当Java代码尝试执行非法转换时,就会发生“Inconvertible Types”错误。

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

阅读此关于如何在Java软件中转换不可转换的类型的讨论。(@StackOverflow)

16.“Missing Return Value”

当return语句包含不正确的类型时,你将收到“Missing Return Value”的消息。例如,以下代码:

返回以下错误:

通常,有一个返回语句不返回任何东西。

阅读此关于如何避免“Missing Return Value”Java软件错误消息的讨论。(@coderanch)

第一部分完,敬请关注第二部分的内容。

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2017-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java大联盟

Java面试手册:核心基础-3

2.数组有没有length()这个方法? String有没有length()这个方法?

1423
来自专栏别先生

python的学习和使用

1220
来自专栏云霄雨霁

SpringMVC--参数绑定笔记

2090
来自专栏思考的代码世界

Python基础学习06天

1474
来自专栏偏前端工程师的驿站

Velocity魔法堂系列二:VTL语法详解

一、前言                               Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页...

2145
来自专栏情情说

深入浅出MyBatis:反射和动态代理

前三篇详细总结了Mybatis的基本特性、常用配置、映射器,相对于Hibernate,映射器的配置相对复杂,但有很好的灵活性和扩展性,可以应对各种业务场景。熟练...

4307
来自专栏Java架构解析

2018最新java面试题(含答案)

基本数据类型包括byte、int、char、long、float、double、boolean和short。

1.7K2
来自专栏Vamei实验室

Java进阶05 多线程

多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式。 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令。单线程好...

2126
来自专栏菜鸟计划

angularjs promise详解

一、什么是Promise Promise是对象,代表了一个函数最终可能的返回值或抛出的异常,就是用来异步处理值的。 Promise是一个构造函数,自己身上有al...

2935
来自专栏Spark生态圈

[Spark SQL] 源码解析之Parser

Parser就是将SQL字符串切分成一个个Token,再根据一定语义规则解析为一棵语法树。我们写的sql语句只是一个字符串而已,首先需要将其通过词法解析和语法解...

2462

扫码关注云+社区