1,Error:系统错误,虚拟机出错,跟系统有关。在代码中处理不了。
2、Exception:可以捕获的异常,且作出处理。要么捕获异常并算出处理,要么继续抛出异常。
3、RuntimeException:经常出现的错误,可以捕获,并作出处理,可以不捕获,也可以不用抛出。比如arrayIndexOutOfBundsException异常可以不捕获,因为在一个程序中,使用很多数组,如果使用一次捕获一次,会产生大量的代码,可读性差,这类异常需要程序员自己控制。
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包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下是在运行期间却不在类路径下的类。