[java从零进阶知识点(一)] Exception 和 Error

  1. Exception 和 Error
    1. Exception 和 Error 都是继承了 Throwable 类, 在 java 中, 只有继承了 Throwable 类才可以使用 throw 抛出, 或者 cath 捕获;
    2. Exception 意为 java 运行时可能发生的不合理的情况, 出现时并不会时程序异常退出。其中 Exception 又分为可检查异常, 非可检查异常。 可检查异常需要显示的捕获, 或者抛出, 不可检查异常不需要显示的捕获, 或者抛出;
    3. Error 意为 java 运行时发生的错误, 出现时绝大部分会使程序异常退出, 使程序无法使用;
  2. 知识扩展
    1. 尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常。
    2. 不要将异常信息吞掉。
    3. 不要使用printStackTrace(),此方法会将信息输出到标准出错系统(standard error stream)中,很难判断到底输出到哪了,最好输出到日志系统中。
  3. 问题集:
    1. NoClassDefFoundError 和 ClassNotFoundException 的区别;
      NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。

      ClassNotFoundException的产生原因主要是:
      Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态地加载类时,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
      解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。
      另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。通过控制动态类加载过程,可以避免上述情况发生。

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

猜你喜欢

转载自www.cnblogs.com/xiong233/p/10942914.html