×

exceptionininitializererror

exceptionininitializererror(java.lang.ExceptionInInitializerError 这个错误 怎么解决)

admin admin 发表于2023-03-22 06:58:52 浏览48 评论0

抢沙发发表评论

本文目录

java.lang.ExceptionInInitializerError 这个错误 怎么解决

当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常。如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行初始化的。如果在这个静态变量初始化的过程中出现了异常,那么就会抛出 java.lang.ExceptionInInitializerError异常。任何异常都可能会引发这种情况,比如说,java.lang.ArrayIndexOutOfBound或者java.lang.NullPointerException。Java开发人员通常会被这个错误弄晕,他觉得自己并没有定义任何的静态初始化块,为什么还会抛出ExceptionInInitializerError异常;事实上,Java默认会将静态变量的初始化放在一个默认的静态初始化块中,然后按它们在源文件中声明的顺序来进行初始化。比如说变量ABC声明在第一行,在第二行中使用到了,而在第三行的时候才初始化,那么第二行的代码会抛出一个NullPointerException异常,这个异常会被封装到一个ExceptionInInitializerError异常中,如果这段代码在主线程中执行了,你会看到控制台或者日志文件中出现这样的错误信息: “Exception in thread “main“ java.lang.ExceptionInInitializerError“。在一个拥有大量日志文件的大型系统中,这样的错误很容易被忽略,而程序员会得到一个java.lang.NoClassDefFoundError异常。不幸的是只有当别人使用到了这个类的时候才会出现这个错误,因为ExceptionInInitializerError导致了这个类无法加载。由于类加载失败了,因此JVM会抛出NoClassDefFoundError。有的时候这会误导Java开发人员,他们会检查类路径,PATH,以及java.library.path看是不是缺少了这个类,却又发现不了任何问题,这让他们很困惑。如果你在分析NoClassDefFoundError的原因,你最好看下你的日志文件中有没有ExceptionInInitializerError,然后再考虑要不要检查classpath。本文中我们将看到一段代码,它会在静态初始化过程中引发异常从而导致 “Exception in thread “main“ java.lang.ExceptionInInitializerError“。在稍后的部分,我们将会看到如何去解决这个问题。 Exception in thread “main“ java.lang.ExceptionInInitializerError的原因 正如别的错误或者异常一样,当你看见这行信息,你知道这是出现ExceptionInInitializerError异常了,这个异常是由于类加载过程中静态块初始化过程失败所导致的。由于它出现在负责启动程序的主线程中,因此你最好从主类中开始分析,这里说的主类是指你在命令行参数中指定的那个,或者说是你声明了public static void main(String args)方法的那个类。如果你仔细地看一下完整的堆栈跟踪信息,你其实什么也不用做,因为JVM已经把类名给打印出来了,这就是引发ExceptionInInitializerError的类。ExceptionInInitializerError是LinkageError的子类,这意味着这个异常会导致你的类无法加载到JVM的内存中。现在我们来看一下这个示例程序,它在执行的时候会抛出下面的异常:
Exception in thread “main“ java.lang.ExceptionInInitializerErrorCaused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.get(ArrayList.java:411) at StaticInitiazerDemo.《clinit》(StaticInitiazerDemo.java:15)看一下栈跟踪信息,你知道真正的异常是java.lang.IndexOutOfBoundsException,它在StaticInitiazerDemo的第二行被抛出来了。这是由于你调用了ArrayList的get()方法并传入了位置0,而这个ArrayList的大小也是0(Index: 0, Size: 0)。看到这条信息后你知道当我们想从列表中取出第一张CreditCard时,这个列表是空的。 import java.util.ArrayList;import java.util.List;/** * Java Program to understand and solve ExceptionInitializerError, which comes * When static initializer blocks throws unchecked exception during class loading * and initialization. * * @author Javin Paul */public class StaticInitializerDemo{private static final List《CreditCard》 cards = new ArrayList《CreditCard》();private static CreditCard prefferdCard = cards.get(0); // 1st card is defaultpublic static boolean isVisa = “VISA“.equalsIgnoreCase(prefferdCard.getNetwork());public static void main(String args) {makePayment(prefferdCard);}public static void makePayment(CreditCard cc) {if (isVisa) {//offer 5% discount}// deduct payment}}class CreditCard {private long card_number; //16 digit card numberprivate int cvv; // 3 digit cvv numberprivate int expiryMonth;private int expiryYear;private String bank;private String network;public CreditCard(long card_number, int cvv, int expiryMonth, int expiryYear, String bank, String network) {super();this.card_number = card_number;this.cvv = cvv;this.expiryMonth = expiryMonth;this.expiryYear = expiryYear;this.bank = bank;this.network = network;}/** * @return the card_number */public final long getCard_number() {return card_number;}/** * @return the cvv */public final int getCvv() {return cvv;}/** * @return the expiryMonth */public final int getExpiryMonth() {return expiryMonth;}/** * @return the expiryYear */public final int getExpiryYear() {return expiryYear;}/** * @return the bank */public final String getBank() {return bank;}/** * @return the network */public final String getNetwork() {return network;}}输出: Exception in thread “main“ java.lang.ExceptionInInitializerErrorCaused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at StaticInitializerDemo.《clinit》(StaticInitializerDemo.java:15)这里是Java中所有Error类的类结构。你可以看到ExceptionInInitializerError是继承自LinkageError的。还应当知道的是,像RuntimeException一样,Error也是未检查异常,编译器是不去检查有没有相应的异常处理代码的。 如何解决Exception in thread “main“ java.lang.ExceptionInInitializerError 需要记住以下几点: 1. “Exception in thread “main“ java.lang.ExceptionInInitializerError“意味着异常出现在主线程,并且是LinkageError的一个子类java.lang.ExceptionInInitializerError,这是JVM类加载失败时才抛出的,原因是静态初始化代码中出现了诸如IndexOutOfBoundsException或者NullPointerException这样的RuntimeException。 2. 记住JVM会将所有的静态变量的初始化按它们在源文件中的出现顺序放到一个静态初始化块中。因此,不要觉得没有看到静态初始块就认为不会出现这个异常。事实上,你得确保静态变量的正确顺序,比如说,如果 一个变量初始化的时候用到了另一个变量,你得确保这个变量在前面已经初始化过了。 3. 如果别的代码想要使用这个类,则会抛出ExceptionInInitializerError异常,而它又会导致ClassNotFoundException或者NoClassDefFoundError。为什么?因为这个类加载失败了,并没有加载到JVM的内存中。因此如果你在解决类不存在之类的异常时,先看看你的日志文件中有没有这个异常。 4. 记住静态初始化代码块会抛出RuntimeException而不是已检查异常,而后者需要有对应的catch块来进行处理。 这就是关于Exception in thread “main“ java.lang.ExceptionInInitializerError的所有东西了。你已经了解到了如何去跟踪此类问题,并找出抛出这个异常的罪魁祸首。需要谨记的是这个异常的一个副作用是NoClassDefFoundError,而Java程序抛出这个异常的位置可能会离java.lang.ExceptionInInitializerError很远,这取决于你的客户端代码何时引用到这个类。因此,在查看类路径解决NoClassDefFoundError异常之前,最好先看看日志有没有出现ExceptionInInitializerError。

android异常java.lang.ExceptionInInitializerError

mContext本来就等于null, 因为你没有初始化instance, 在你的静态函数里改一改吧。
if (instance == null) return new MyApplication();
else return instance;

java.lang.ExceptionInInitializerError

你这个里面有没有动态代理生成的类的包名在已知的另一个 sealed jar 包内?比如 microsoft 的某个 java.sql.Connection 的实现类的包名可能是 com.microsoft.sqlserver.jdbc.MSConnectionImpl,如果我们的 Spring AOP 生成它的一个子类(包名当然也是 com.microsoft.sqlserver.jdbc 了),而当这个 sqlserver 驱动 jar 本身的 META-INF/MANIFEST.MF 中声明这个 jar 是已经签名了并且 sealed 了那么这就导致安全异常,因为 sealed 声明表示 com.microsoft.sqlserver 包是 M$ 提供的,出了问题找微软咨询,当我们把一个临时的类冒充是微软提供的就是篡改行为。
从你这个日志中还不能看出这点来,但我们需要检查有没有类似的情况,如果不是 AOP 自动生成的类,我们只要保证不冒充它的包名就可以了。
下面这个无法断定是否有类似嫌疑。
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.loader)
另外Tomcat 上也可以配置当访问一些Tomcat平台的内部的类时需要配置权限,tomcat 的实现类会先检查权限,一般目的就是防止有些程序想通过反射的方式访问服务器平台提供的一些内部功能,而服务器希望大家不要这样做除非你非常确定它可能的影响(比如移植性受限),因此服务器可能会默认地会给服务器自已配置权限并且在服务器中明确的启用了 Java 2 Security 功能,这样当我们写一个自定义的 LifeCycleListener 时访问了这些内部的实现类时就会出错,我们需要明确的配置权限给我们的 LifeCycleListener 来确实你已经了解了这个事实。
比如下面这个文档中就配置了访问某些包的权限,当我们没有配置时就表示我们不了解服务器期望的事情,我们需要先思考再决定是否这样配置。

java.lang.exceptionininitializererror

com.hiaward.house.service.impl.HouseReleaseServiceImpl问题好像出在这个类实例化时,发生了IndexOutOfBoundsException,数组越界的错误,你看看是不是数组为,但是取值超过的

Exception in thread “main“ java.lang.ExceptionInInitializerError 错误 求助

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ’order (id integer not null auto_increment, user_id integer, order_id integer, da’ at line 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936
初步判断是 date 作为字段名 的问题

JAVA初学问题,java.lang.ExceptionInInitializerError:main.

你的class里没有main方法。JAVA程序都是从main方法开始执行的,没有这个method就无法跑。
public class abc
{
public static void main(String args){
int i=1,j=3;
float f1=(float)0.1; float f2=123;
long l1=12345678, l2=8888888888L;
double d1=2e20, d2=124;
byte b1=1, b2=2, b3=127;
j=j+10;
i=i/10;
i=(int)(i*0.1);
char c1=’a’,c2=125;
byte b=(byte)(b1-b2);
char c=(char)(c1+c2-1);
float f3=(float)(f1+f2);
float f4=(float)(f1+f2*0.1);
double d=d1*i+j;
float f=(float)(d1*5+d2);
}
}

请帮帮忙,在IE上运行java弹出错误信息:RuntimeException java.lang.ExceptionInInitializerError

  1. 清除IE缓存。

  2. 注册IE组件。

  3. 修复注册表。

  4. 调低cookie隐私等级。

  5. 关闭GPU加速(适用于IE9以上版本)。

  6. 重置IE。

延展阅读:

Java简介

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

主要组成

  1. Java编程语言,即语法。

  2. Java文件格式,即各种文件夹、文件的后缀。

  3. Java虚拟机(JVM),即处理*.class文件的解释器。

  4. Java应用程序接口(Java API)。

基本语法

  1. 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。

  2. 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass。

  3. 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaClass。

  4. 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。

  5. 主方法入口:所有的Java 程序由public static void main(Stringargs)方法开始执行。

spark 2.0.0运行JavaWordCount出现 java.lang.ExceptionInInitializerError,如何解决

com.hiaward.house.service.impl.HouseReleaseServiceImpl问题好像出在这个类实例化时,发生了IndexOutOfBoundsException,数组越界的错误,你看看是不是数组为,但是取值超过的