Exception和Error

Exception和Error都继承了Throwable类,在java中只有Throwable类的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成部分。
Exception和Error体现了java平台设计者对不同异常情况的分类,Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的,不可恢复状态。既然是非正常情况,就不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查异常和不检查异常。可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。不检查异常就是所谓的运行时异常,类似NullPointerException,ArrayIndexOutOfBoundsException之类,通常是可以避免的逻辑错误,可以根据具体情况来判断是否需要捕获,并不会在编译期强制要求。

1.Error:系统错误,虚拟机出错,我们处理不了,也不需要我们来处理。
2.Exception,可以捕获的异常,且作出处理。也就是要么捕获异常并作出处理,要么继续抛出异常。
3.RuntimeException,经常性出现的错误,可以捕获,并作出处理,可以不捕获,也可以不用抛出。ArrayIndexOutOfBoundsException像这种异常可以不捕获,为什么呢?在一个程序里,使用很多数组,如果使用一次捕获一次,则很累。
4.继承某个异常时,重写方法时,要么不抛出异常,要么抛出一模一样的异常。
5.当一个try后跟了很多个catch时,必须先捕获小的异常再捕获大的异常。
6.假如一个异常发生了,控制台打印了许多行信息,是因为程序中进行多层方法调用造成的。关键是看类型和行号。
7.上传下载不能抛异常。上传下载一定要关流。
8.异常不是错误。异常控制代码流程不利于代码简单易读。
9.try catch finally执行流程,与 return,break,continue等混合使用注意代码执行顺序。不是不可以,而是越是厉害的人,代码越容易理解。

NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。
ClassNotFoundException的产生原因:

Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态地加载类时,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。

NoClassDefFoundError产生的原因在于:
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError.
造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

你可能感兴趣的:(java核心技术)