java.lang.IllegalArgumentException: URI is not hierarchical
Thread.currentThread().getContextClassLoader("类的全路径").getClass().newInstance()![]()
一个类的静态块初始化异常了,后面调用这个类创建对象会报错吗?
是的,如果一个类的静态块初始化过程中抛出了异常,后续任何尝试创建该类的对象或访问该类的静态成员都会失败,并抛出 ExceptionInInitializerError
或显示 "Could not initialize class ClassName" 的错误。
这是因为 Java 类加载机制的工作方式:
-
当 JVM 第一次遇到一个类时(通过创建对象、访问静态成员等方式),它会触发类加载过程
-
类加载过程包括:加载、验证、准备、解析和初始化几个步骤
-
在初始化阶段,JVM 会执行类的静态初始化块和静态字段初始化
-
如果在这个过程中抛出了任何异常,那么类的初始化会失败
-
一旦类初始化失败,JVM 会将该类标记为不可用状态
-
之后任何尝试使用该类的操作都会导致
NoClassDefFoundError
或者显示 "Could not initialize class ClassName" 的错误
这就是为什么当 HiveConf
类的静态初始化块失败后,后续调用 HiveConf.setHiveSiteLocation(null)
或创建 HiveConf
对象时会报 "Could not initialize class org.apache.hadoop.hive.conf.HiveConf" 的错误。
要解决这个问题,您需要修复导致静态初始化块失败的根本原因,在这种情况下,就是解决 URI is not hierarchical
错误。