困扰 Java 初学者的 6 个 Java 异常。
(原创) (我对Java和英语都是新手,所以我很高兴收到批评和帮助)
无论是以前还是现在,我都遇到过很多 Java 新手,他们对一些常见的异常有疑问,我必须再次解释一下。我相信其他高级 Java 开发人员也有同样的问题,试图帮助新手处理这些异常。于是,为了自己的发展,写了这篇文章。请随意对本文发表评论或在下面的列表中添加例外情况。
1.NoClassDefFoundError _
这是大多数新 Java 开发人员在 Java 编程世界中遇到的异常之一,其中包含诸如
“线程“main”NoClassDefFoundError 中的异常”之类的消息。初学者编写一个程序,显示“Hello world!”,进入命令行,输入“java ...”,按 Enter 键,然后“砰!” =)。并弄清楚如何让程序打印“Hello world!” 在监视器上,需要一些时间。
当Java 虚拟机 (JVM) 在启动时尝试访问某个类但未找到该类时,即使在编译时找到了相同的类,也会发生 NoClassDefFoundError。大多数情况下,当尝试使用“java”命令执行程序并且类路径设置不正确时,会发生此异常。这里描述一下出现这个异常的原因。
- 该类在 -classpath 中不可用。
- CLASSPATH 环境变量已被覆盖。您可以使用 Windows 命令“set”检查其存在性和正确性。
这里更详细地描述了该问题的解决方案
。
此外,您需要了解 CLASSPATH 环境变量和解释器键 -classpath 之间的区别。专业人士不建议使用CLASSPATH。最好的方法是将 -classpath 键传递给解释器。
ClassNotFoundException 是另一个异常,对于刚开始编程的新手来说,它就是一场噩梦。有趣的是,普通 Java 开发人员经常
对 ClassNotFoundException 和 NoClassDefFoundError 异常感到困惑。因此,这两种例外之间的区别仍然是
初级职位面试中最常见的问题之一。当JVM 尝试加载特定类但在类路径中找不到它
时,会发生 ClassNotFoundException 。新 Java 开发人员第一次遇到它的常见地方之一是使用 JDBC 库连接到数据库。在那里,我们将尝试使用 Class.forName("JDBCdriver") 之类的代码加载驱动程序。
这里有一篇关于 ClassNotFoundException 的好文章。尝试理解
Java类加载器的概念是处理这个问题最有效的方法。您可以阅读
如何在 Win/Unix 环境中配置 Java 类路径。
正如java文档中所述,以下情况会发生异常:
- 您尝试使用 Class.forName 方法加载类,但 .class 文件不在类路径中。这是此处列出的三种情况中最常见的情况。
- 当类加载器尝试使用 loadClass 加载类时。
- 当类加载器尝试使用 findSystemClass 加载类时。
对于初学者来说,这个异常比前两个更容易理解。此外,
这个异常很容易识别,因为 当发生异常时,有关异常的消息
会指示发生异常的程序中的行号。当 JVM 尝试访问对象或尝试调用对象的方法并收到 null 而不是对该对象的引用时,会发生此异常。Java Doc 还指出了以下原因:
- 访问或更改无效对象的方法。(即,它不是对 JVM 对象的引用,而是 null)
- 当数组无效时获取数组的长度。(例如未初始化)
- 尝试访问不存在的对象类型数组元素。(即,当数组元素包含 null 而不是对象引用时)
避免此异常的最简单方法是使用非 NULL 检查。然而,迟早这会成为 Java 开发实践,你会发现到处都是非 NULL 检查。有趣的是,到处
插入非 NULL 检查并不被认为是好的编程风格。使用非 NULL 检查的主要原因是开发人员希望在失败或错误时传递 null 对象。相反,程序员应该使用
返回空对象而不是 null 值作为程序在发生错误时的行为的基本逻辑,这是
一种良好的编程实践。然而,采用这种编程实践比看起来更困难。
我们的资源中有一篇关于此的好文章。
这是初学者熟悉的另一个异常,当尝试将对象转换为不是其子类的类时会发生这种情况。同样,这很容易理解、识别并且修复起来也很简单。当运行时对象的类型未知时,避免此异常的一种方法是使用
“InstanceOf”来检查该对象是否是特定类的实例。
此异常是不言自明的,当 JVM 尝试访问具有不存在索引(例如负数 (-1) 或大于或等于数组大小)的数组元素时,就会发生此异常。
它很容易理解、定义和纠正。例如,创建循环时
for (i = 0; i <= cmd_stack.length; i++) System.out.println(cmd_stack[i]);
会出现异常,因为数组中索引从0开始,而length方法返回元素的数量,并且该数量比最后一个索引的值大1。正确使用
for (i = 0; i < cmd_stack.length; i++) System.out.println(cmd_stack[i]);
这种异常不太常见,而且相当容易理解、识别和解决。当 JVM 尝试调用不存在的方法或带有无效参数的方法时,就会发生这种情况。
GO TO FULL VERSION