50个常见的Java错误及避免方法

转载自:动力节点Java学院



编译器错误

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


1. “...Expected”

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

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


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

2. “Unclosed String Literal”

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

通常。这种情况发生在:

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

3. “Illegal Start of an Expression”

出现“Illengal Start of an Expression” 错误的原因有很多。因此名列不太有用的错误消息之一。有些开发者甚至认为这是由坏的代码造成的。
通常,创建表达式是为了生成新的值或为变量分配值。编译器期望找到表达式,但因为语法不符合预期而找不到表达式。在这些语句中就可以发现此错误。


4.“Cannot Find Symbol”

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

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

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

5. “Public Class XXX Should Be in File”

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

为解决这个问题:

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


6. “Incompatible Types”

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

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

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


7. “Invalid Method Declaration;Return Type Required”

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

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

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


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

它阐明了方法签名正在调用错误的参数。

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


9. “Missing Return Statement”

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

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

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


10. “Possible Loss of Precision”

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

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

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

11.“Reached End of File While Parsing”

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

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


12. “Unreachable Statement”

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

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


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

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


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

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

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


15. “Inconvertible Types”

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

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


16. “Missing Return Value”

当return 语句包含不正确的类型时,你讲收到“Missing Return Value” 的消息。

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


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

当一个void方法尝试返回值时,就会发生此Java错误,

通常,这可以通过更改方法签名匹配返回语句中的类型来修正错误。


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

当编译器尝试从静态方法(@javinpaul)访问非静态变量时,就会发生此错误:

要修复这个错误,可以做这两件事:

  • 在签名中声明此变量为静态
  • 在静态方法中写代码创建非静态对象的实例

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

此问题发生在Java代码尝试在非静态类中调用非静态方法的情况下。

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


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

当数组被声明但未初始化时,就会收到这条消息,数组的长度是固定的,因此每个数组都需要以所需的长度进行初始化。


21. “ArrayIndexOutOfBoundException”

这是在代码尝试访问不在值内的数组索引时发生的运行时错误消息。

数组索引从零开始,结束于小于数组长度的那一个。通常,当定义数组索引的限制时,通过使用“<” 而不是“<=”来修复。


22. “StringIndexOutOfBoundsException”

当代码尝试访问不在字符串范围内的字符串的一部分时,就会发生这种问题。通常,这发生在代码尝试创建字符串的子字符串,且长度与参数设置不符之时。

和数组索引一样,字符串索引从0开始。在索引字符串的时候,最后一个字符小于字符串的长度。

“StringIndexOutOfBoundsException” Java软件错误消息通常意味着索引正在尝试访问没有包含的字符。


23. “NullPointerException”

当程序尝试使用没有赋值的对象引用时,就会出现“NullPointerException” 异常。

Java程序经常在以下情况下出现异常:

  • 语句引用一个空值的对象
  • 尝试访问一个已定义但未分配引用的类。

24. “NoClassDefFoundError”

当解释器找不到包含主方法的类的文件时,将发生“NoClassDefFoundError” 异常。发生这种情况的原因有:

  • 文件不在正确的目录内。
  • 类的名称必须与文件的名称相同(不包含文件扩展名)。名称分大小写。

25.“NoSuchMethodFoundError”

当Java软件尝试调用类的方法并且该方法不再有定义时,将发生此错误信息;

当声明中有错别字时,通常会出现此异常。


26. “NoSuchProviderException”

当请求的安全提供程序不可用时,会发生此异常。

当试图找到为什么发生“NoSuchProviderException”时,请检查:

  • JRE配置
  • 配置中设置的Java home。
  • 使用哪个Java环境
  • 安全提供程序条目。

27. “AccessControlException”

AccessControlException 表示所请求的访问的系统资源,如文件系统或网络时被拒绝的:


28. “ArrayStoreException”

当Java数组中转换元素的规则被破坏时,就会发生 “ArrayStoreException” 异常。对于放到数组中的内容一定要非常小心;

当数组被初始化时,我们需要声明允许进入数组对象的种类。每个数组元素都需要成为相同类型的对象。


29. “Bad Magic Number”

此Java软件错误消息意味着网络上的类定义文件可能出错了。

“Bad Magic Number”错误消息可能发生在以下情况下:

  • 类文件的前四个字节不是十六进制数字CAFEBABE
  • 类文件以ASCII模式而不是以二进制模式上传
  • Java程序在编译之前运行


30. “Broken Pipe”

此错误消息是指来自文件或网络套接字的数据流已停止工作或从另一端关闭。

出现“Broken Pipe” 的原因通常有:

  • 耗尽磁盘暂存空间
  • RAM可能被堵塞
  • 数据流可能已损坏
  • 读取管道的过程可能已经关闭


31. “Could Not Create Java Virtual Machine”

当我们尝试调用带有错误参数的Java代码时,通常会产生此Java错误消息;

这通常是由于代码中的声明存在错误或为其分配适当的内存而引起的。


32. “class file contains wrong class”

当Java代码尝试在错误的目录中寻找类文件时,就会出现“class file contains wrong class” 的问题。

要修复此错误,以下这些提示可以提供帮助:

  • 确保源文件的名称和类的名称匹配——包括大小写。
  • 检查软件包语句是否正确或是缺失。
  • 确保源文件位于正确的目录中。


33. “ClassCastException”

“ClassCastException” 消息指示了Java代码正在尝试将对象转换为错误的类。

Java代码将创建一个类和子类的层次结构。为了避免“ClassCastException” 错误,请确保新类型属于正确的类或其父类之一。如果使用泛型,则编译代码时可能会捕获这些错误。


34. “ClassFormatError”

“ClassFormatError” 消息指示链接错误,并且发生在类文件不能被读取或解释为类文件的时候。

有若干原因会导致“ClassFormatError”错误:

  • 类文件以ASCII模式而不是二进制模式上传。
  • web服务器必须以二进制而不是ASCII格式发送类文件。
  • 可能会有一个类路径错误,阻止了代码找到类文件。
  • 如果类被加载两次,那么第二次将导致抛出异常。
  • 正在使用旧版本的Java运行时。


35. “ClassNotFoundException”

“ClassNotFoundException” 仅在运行时发生——意味着在编译期间有一个类在运行时缺失了。这是一个链接错误。

很像“NoClassDefFoundError”,在以下情况会出现这个问题:

  • 该文件不在正确目录中。
  • 类的名称必须与文件的名称相同(不包括文件扩展名),名称区分大小写。


36. “ExceptionInInitializerError”

此Java问题发生在静态初始化出错的时候。当Java代码稍后使用类时,将发生“NoClassFoundError”错误。

修复此错误我们需要更多的信息。在代码中使用getCause() 可以返回导致错误的异常。


37. “IllegaBlockSizeException”

当长度消息不是8字节的倍数时,那么在解密期间就会抛出 “IllegaBlockSizeException”异常。

 “IllegaBlockSizeException” 可能是由以下原因引起的:

  • 使用不同的加密和解密算法选项。
  • 要解密的消息可能在传输中被截断或乱码。


38. “BadPaddingException”

当使用填充来创建一个消息而不是8字节的倍数时,那么在解密期间可能会出现“BadPaddingException” 异常。

加密数据时二进制的,所以不要尝试将其存储在字符串或在加密期间没有被正确填充的数据中。


39. “IncompatibleClassChangeError”

“IncompatibleClassChangeError” 是LinkageError的一种形式,如果一个在基类在编译子类之后发生变化,那么就会出现此异常。

出现“IncompatibleClassChangeError” 有可能的原因是:

  • 忘记了主方法的静态。
  • 非法使用了legal类。
  • 类被修改了,并且存在通过旧的签名从另一个类到这个类的引用。尝试删除所有类文件并重新编译所有内容。


40. “FileNotFoundException”

当具有指定路径名的文件不存在时,将抛出此Java软件错误信息。

除了没有指定路径名的文件之外,这可能意味着现有文件无法访问。


41. “EOFException”

当输入期间意外终止文件或流时,将抛出“EOFException”。

当DataInputStream类尝试在流中读取数据但没有更多数据时,将抛出“EOFException”。它也可以发生在ObjectInputStream和RandomAccessFile类中。


42. “UnsupportedEncodingException”

当不支持字符编码时,会抛出此Java软件错误信息。

正在使用的Java虚拟机可能不支持给定的字符集。


43. “SocktException”

“SocktException” 异常表示创建或访问套接字时出错。

当由于以下原因而达到最大连接时,通常会抛出此异常:

  • 没有更多的网络端口可用于应用程序。
  • 系统没有足够的内存来支持新的连接。


44. “SSLException”

此Java软件错误信息发生在与SSL相关的操作出现故障的时候。发生这种情况的原因有:

  • 服务器或客户端上的证书已过期。
  • 服务器端口已重置为另一个端口。

45. “MissingResourceException”

当资源丢失时,会发生此异常。如果资源在正确的类路径中,那么通常是因为属性文件没有正确配置。


46. “NoInitialContextException”

当Java应用程序想要执行命令操作但无法创建连接时,会发生此异常。

这解决起来可能会是一个复杂的问题,但这里有一些可能导致“NoInitialContextException”Java错误信息的原因:

  • 应用程序可能没有正确的凭据进行连接。
  • 代码可能无法识别所需的JNDI实现。
  • InitialContext 类可能没有配置正确的属性。


47. “NoSuchElementException”

当迭代(例如“for” 循环)尝试访问下一个元素而没有元素的时候,就会出现“NoSuchElementException” 异常。

抛出“NoSuchElementException” 可能的途径:

  • Enumeration::nextElement()
  • NamingEnumeration::next()
  • StringTokenize::nextElement()
  • Iterator::next()


48. “NoSuchFieldError”

当应用程序尝试访问对象中的一个字段,但指定的字段不在存在与对象中时,将抛出此Java软件错误消息。

通常,该错误在编译器中被捕获,但是如果 在编译和运行之间更改了类定义,则在运行时将被捕获。


49. “NumberFormatException”

当应用程序尝试将字符串转换为数字类型,但该数字不是有效的数字字符串时,会出现此Java软件错误消息。

可能抛出“NumberFormatException” 的原因有:

  • 数字中的前导或尾随空格
  • 标志不在数字前面。
  • 数字有逗号
  • 本地化可能不会将其分类为有效数字。
  • 数字太大,不适合数字类型。


50. “TimeoutException”

当阻塞操作超时时,会出现此Java软件错误信息。


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值