- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么? 你的反应是不是像下面一样呢?
直接看下图,展示了三者之间的关系:
Throwable
是 Error
和 Exception
的父类。 Exception
是程序正常运行中可预料的正常情况,应该被捕获并进行处理。
ArrayIndexOutOfBoundsException
、 ArithmeticException
等。一般可由代码逻辑避免,可看情况是否捕获。 Error
一般是正常情况下不太可能出现的,绝大部分 Error 会导致程序处于不可恢复的状态,所以也不必捕获。如 OutOfMemoryError
。
你在面试中也许会被问到:
NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
首先,我们看这俩名字,一个是 Error 另一个是 Exception ,从上面的介绍以及看下面的继承图可以得到: ClassNotFoundException 应是编码时要被捕获的异常, NoClassDefFoundError 是编译通过了,但运行时产生的重大问题.
进一步的: ClassNotFoundException 是运行中动态加载类时出现的问题。 举例来说,使用 Class.forName 来动态加载一个类,如果你不显示的 catch 处理,ide 都会给你提示,并且也过不了编译.
// 错误写法
public void except() {
Class.forName("com.test.aaa");
}
// 正确写法
public void except() {
try {
Class.forName("com.test.aaa");
} catch (ClassNotFoundException e) {
// throw or log
throw new RuntimeException(e);
// log.error("ClassNotFoundException: ", e);
}
}
NoClassDefFoundError 是编译时没问题,但运行时 new 实例找不到。 比如在一个类中引用另一个类的函数,编译后把另一个类的 class 文件删掉:
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
MyPrint.printName();
}
}
public class MyPrint {
public static void printName() {
System.out.println("my name is zhangsan");
}
}
使用 javac 编译,再删除 MyPrint.class 。
$ tree com
com
└── shuofxz
├── Main.class
├── Main.java
├── MyPrint.class # 把这个文件删掉
└── MyPrint.java
执行程序,就会看到 NoClassDefFoundError ,并且是由 ClassNotFoundException 引起的.
Exception in thread "main" java.lang.NoClassDefFoundError: com/shuofxz/MyPrint
at com.shuofxz.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: com.shuofxz.MyPrint
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
... 1 more
一)看下面的代码有什么问题?
try {
// 业务代码
// ...
Thread.sleep(1000L);
} catch (Exception e) {
}
Exception
,应改为对应的 InterruptedException
。这么做的目的是因为:第一方便阅读代码,知道可能会出现什么具体的异常;第二不捕获意料之外的异常。 二)再看下面这个,增加了异常打印逻辑,还有什么问题不?
try {
// 业务代码
// …
} catch (IOException e) {
e.printStackTrace();
}
e.printStackTrace()
的功能是:Prints this throwable and its backtrace to the standard error stream。 你很难判断它到底输出到哪里去了。 三)再来看下面的:
try {
// 业务逻辑 A
// 业务逻辑 B
// 业务逻辑 C
// ...
} catch (Exception e) {
log.error("have exception", e);
}
四)我们前面介绍了Exception、Error、Throwable,为什么代码中经常能看到 catch XXException ,却几乎看不到 catch XXError 或 catch Throwable 呢?
本篇介绍了 Exception Error Throwable 的区别,并给出了相关例子帮助理解。 回到开头的问题:「叙述一下 Exception Error Throwable 的区别」你心里有数了么?
最后此篇关于【Java面试指北】ExceptionErrorThrowable你分得清么?的文章就讲到这里了,如果你想了解更多关于【Java面试指北】ExceptionErrorThrowable你分得清么?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!