java.lang.NoClassDefFoundError:如何解決–第3部分

本文是我們的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那樣,有許多可能導致NoClassDefFoundError的問題。 本文將重點介紹該問題的最常見原因之一:Java類靜態初始化程序塊或變量的失敗。

將提供一個示例Java程序,我鼓勵您從工作站上編譯并運行此示例,以正確復制和理解此類NoClassDefFoundError問題。

再談Java靜態初始值設定項

Java編程語言為您提供了“靜態”初始化變量或代碼塊的功能。 這可以通過“靜態”變量標識符或在Java類的標頭使用static {}塊來實現。 靜態初始化程序保證在JVM生命周期中只能執行一次 ,并且通過設計是線程安全的,這使其在靜態數據初始化(例如內部對象緩存,記錄器等)中的使用非常吸引人。

問題是什么? 我將再次重復,保證靜態初始化程序在JVM生命周期中只能執行一次……這意味著此類代碼在Class加載時執行,并且在您重新啟動JVM之前不會再次執行。 現在,如果當時執行的代碼(@Class加載時間)以未處理的異常終止會發生什么?

歡迎來到java.lang.NoClassDefFoundError問題案例#2!

NoClassDefFoundError問題案例2 –靜態初始化失敗

靜態初始化程序代碼失敗,再加上嘗試創建受影響的(未加載)類的新實例的連續嘗試,便會發生此類問題。

示例Java程序

以下簡單的Java程序按以下方式拆分:

–主Java程序NoClassDefFoundErrorSimulator
–受影響的Java類ClassA
– ClassA為您提供一個ON / OFF開關,使您可以復制要研究的問題類型

該程序只是試圖嘗試創建ClassA的新實例3次(一個接一個)。 它將演示靜態變量或靜態塊初始化程序的初始失敗,再加上嘗試創建受影響的類的新實例的連續嘗試,將觸發java.lang.NoClassDefFoundError。

#### NoClassDefFoundErrorSimulator.java
package org.ph.javaee.tools.jdk7.training2;/*** NoClassDefFoundErrorSimulator* @author Pierre-Hugues Charbonneau**/
public class NoClassDefFoundErrorSimulator {/*** @param args*/public static void main(String[] args) {System.out.println("java.lang.NoClassDefFoundError Simulator - Training 2");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com\n\n");              try {                 // Create a new instance of ClassA (attempt #1)System.out.println("FIRST attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {any.printStackTrace();}             try {                 // Create a new instance of ClassA (attempt #2)System.out.println("\nSECOND attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {                   any.printStackTrace();}      try {                 // Create a new instance of ClassA (attempt #3)System.out.println("\nTHIRD attempt to create a new instance of ClassA...\n");        ClassA classA = new ClassA();} catch (Throwable any) {                   any.printStackTrace();}             System.out.println("\n\ndone!");}
}
#### ClassA.java
package org.ph.javaee.tools.jdk7.training2;/*** ClassA* @author Pierre-Hugues Charbonneau**/
public class ClassA {private final static String CLAZZ = ClassA.class.getName();// Problem replication switch ON/OFFprivate final static boolean REPLICATE_PROBLEM1 = true; // static variable initializerprivate final static boolean REPLICATE_PROBLEM2 = false; // static block{} initializer// Static variable executed at Class loading timeprivate static String staticVariable = initStaticVariable();// Static initializer block executed at Class loading timestatic {// Static block code execution...if (REPLICATE_PROBLEM2) throw new IllegalStateException("ClassA.static{}: Internal Error!");}public ClassA() {System.out.println("Creating a new instance of "+ClassA.class.getName()+"...");}/**** @return*/private static String initStaticVariable() {String stringData = "";if (REPLICATE_PROBLEM1) throw new IllegalStateException("ClassA.initStaticVariable(): Internal Error!");return stringData;}
}

問題重現

為了復制問題,我們將簡單地“自愿”觸發靜態初始化器代碼的失敗。 請簡單地啟用您要研究的問題類型,例如靜態變量或靜態塊初始化程序失敗:

// Problem replication switch ON (true) / OFF (false)private final static boolean REPLICATE_PROBLEM1 = true; // static variable initializerprivate final static boolean REPLICATE_PROBLEM2 = false; // static block{} initializer

現在,讓我們在兩個開關都處于OFF的情況下運行程序(兩個布爾值都為false)
##基準(正常執行)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...SECOND attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...THIRD attempt to create a new instance of ClassA...Creating a new instance of org.ph.javaee.tools.jdk7.training2.ClassA...done!

對于初始運行(基準),主程序能夠成功創建3個ClassA實例,而不會出現問題。

##問題再現運行(靜態變量初始化程序失敗)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...java.lang.ExceptionInInitializerErrorat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:21)Caused by: java.lang.IllegalStateException: ClassA.initStaticVariable(): Internal Error!at org.ph.javaee.tools.jdk7.training2.ClassA.initStaticVariable(ClassA.java:37)at org.ph.javaee.tools.jdk7.training2.ClassA.<clinit>(ClassA.java:16)... 1 moreSECOND attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:30)THIRD attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:39>)done!

##問題再現運行(靜態塊初始化程序失敗)

java.lang.NoClassDefFoundError Simulator - Training 2Author: Pierre-Hugues Charbonneauhttp://javaeesupportpatterns.blogspot.comFIRST attempt to create a new instance of ClassA...java.lang.ExceptionInInitializerErrorat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:21)Caused by: java.lang.IllegalStateException>: ClassA.static{}: Internal Error!at org.ph.javaee.tools.jdk7.training2.ClassA.<clinit>(ClassA.java:22)... 1 moreSECOND attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:30)THIRD attempt to create a new instance of ClassA...java.lang.NoClassDefFoundError: Could not initialize class org.ph.javaee.tools.jdk7.training2.ClassAat org.ph.javaee.tools.jdk7.training2.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.java:39)done!

發生了什么? 如您所見,第一次嘗試創建ClassA的新實例確實觸發了java.lang.ExceptionInInitializerError。 此異常表示我們的靜態變量&bloc的靜態初始化程序失敗,這正是我們想要實現的目標。

此時要了解的關鍵點是,此故障確實阻止了ClassA的整個類加載。 如您所見,嘗試#2和嘗試#3都生成了java.lang.NoClassDefFoundError,為什么? 好吧,因為第一次嘗試失敗了,所以可以防止ClassA的類加載。 連續嘗試在當前ClassLoader中創建ClassA的新實例的做法一遍又一遍地產生了java.lang.NoClassDefFoundError,因為在當前ClassLoader中未找到ClassA。

如您所見,在此問題上下文中,NoClassDefFoundError只是另一個問題的癥狀后果 。 最初的問題是在靜態初始化程序代碼失敗后觸發的ExceptionInInitializerError。 這清楚地說明了使用Java靜態初始化程序時正確進行錯誤處理和記錄的重要性。

建議和解決策略

現在在下面找到我對NoClassDefFoundError問題案例2的建議和解決策略:
–檢查java.lang.NoClassDefFoundError錯誤并確定缺少的Java類
–對受影響的類執行代碼演練,并確定其是否包含靜態初始化程序代碼(變量和靜態塊) –檢查您的服務器和應用程序日志,確定是否有任何錯誤(例如ExceptionInInitializerError)源自靜態初始化程序代碼–確認后,進一步分析代碼并確定初始化程序代碼失敗的根本原因。 您可能需要添加一些額外的日志記錄以及適當的錯誤處理,以防止并更好地處理將來的靜態初始化程序代碼失敗

請隨時發表任何問題或評論。

第4部分將開始介紹與類加載器問題有關的NoClassDefFoundError問題。

參考: java.lang.NoClassDefFoundError:如何解決–第3部分,來自我們的JCG合作伙伴 Pierre-Hugues Charbonneau,位于Java EE支持模式和Java教程博客。


翻譯自: https://www.javacodegeeks.com/2012/07/javalangnoclassdeffounderror-how-to.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372162.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django實現瀑布流、組合搜索、階梯評論、驗證碼

django實現圖片瀑布流布局 我們在一些圖片網站上經常會看到&#xff0c;滿屏都是圖片&#xff0c;而且圖片都大小不一&#xff0c;卻可以按空間排列。默認一個div是占用一行&#xff0c;當想把div里的圖片并排顯示的時候&#xff0c;只能使用float屬性&#xff0c;但是&#xf…

通過ifrmae異步下載文檔

//通過ifrmae異步下載文檔 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO與NIO –中斷,超時和緩沖區

假設有一個系統有時需要將文件復制到幾個位置&#xff0c;但是這種方式在響應速度至關重要的情況下。 換句話說&#xff0c;如果由于某種原因文件系統過載&#xff0c;并且我們無法在不到一秒鐘的時間內寫入文件&#xff0c;則應該放棄。 ExecutorService是一項非常方便的工作工…

實驗5 matlab程序設計2,實驗5 Matlab程序設計2

實驗5 Matlab程序設計21. 實驗目的&#xff1a;2. 掌握建立和執行M文件的方法&#xff1b; 3. 掌握實現選擇結構的方法&#xff1b; 4. 掌握實現循環結構的方法。5. 熟悉利用向量運算來代替循環操作的方法。 6. 實驗內容&#xff1a;27. 根據61111 122232n2&#xff0c;求π的近…

【poj1041】 John's trip

http://poj.org/problem?id1041 (題目鏈接) 題意 給出一張無向圖&#xff0c;求字典序最小歐拉回路。 Solution 這鬼畜的輸入是什么心態啊mdzz&#xff0c;這里用vector儲存邊&#xff0c;便于邊的排序。瞬間變成STL常數boy →_→。 細節 數組大小把握好。 代碼 // poj1041 #i…

記一次ora-1652錯誤的解決過程

報錯現象&#xff1a; 通過v$RMAN_BACKUP_JOB_DETAILS查看備份狀態&#xff0c;一直卡著不出結果&#xff0c;很長一段時間之后拋出ORA-1652: unable to extend temp segment by 128 in tablespace &#xff0c;此時查看臨時表空間使用情況&#xff0c;發現占用很少&#xff0c…

帶有docx4j的Java Word(.docx)文檔

幾個月前&#xff0c;我需要創建一個包含許多表和段落的動態Word文檔。 過去&#xff0c;我曾使用POI來實現此目的&#xff0c;但是我發現它很難使用&#xff0c;并且在創建更復雜的文檔時對我來說效果不佳。 因此&#xff0c;對于這個項目&#xff0c;經過一番搜索&#xff0c…

mysql中distinct關鍵字,MySQL關鍵字Distinct的詳細介紹

DDLPrepare SQL&#xff1a;?Prepare Data&#xff1a;?查詢數據如下圖所示&#xff1a;第一種情況&#xff0c;使用Distinct關鍵字&#xff0c;查詢單列數據&#xff0c;如下圖所示&#xff1a;結果&#xff1a;對 name 字段進行去重處理&#xff0c;符合預期期望&#xff0…

#pragma 預處理指令

Linux C 編程一站式學習 #pragma 預處理指示供編譯器實現一些非標準的特性&#xff0c;C 標準沒有規定 #pragma 后面應該寫什么以及起什么作用&#xff0c;由編譯器自己規定。有的編譯器用 #pragma 定義一些特殊功能寄存器名&#xff0c;有的編譯器用 #pragma 定位鏈接地址&…

px ,em ,rem

做移動端或者響應式的頁面必然需要字體的變化的。這次我就自己的經驗來說說他們之間的關系&#xff0c;以及怎么用。 px (絕對單位)是我們常用的就不說了。 em&#xff08;相對單位&#xff0c;相對父級&#xff09; em 指字體高&#xff0c;任意瀏覽器的默認字體高都是16px。所…

使用JAnnocessor生成Java代碼

在本文中&#xff0c;我將向你展示如何生成的代碼JAnnocessor通過創建框架Nikolche Mihajlovski 。 在Nikolche的演講中&#xff0c;我第一次在GeeCON 2012大會上遇到JAnnocessor&#xff1a; “創新和實用的Java源代碼生成” &#xff08;幻燈片&#xff09; 。 之后&#xff…

Linq學習筆記(轉)

開始Linq前你要知道的 擴展方法 顧名思義就是對現有類進行擴展的的方法&#xff0c;擴展方法可以在不修改現有類的情況下&#xff0c;為現有類增加公共的接口&#xff08;不是C#中的interface&#xff09;。 擴展方法本質上是一個靜態方法&#xff0c;不同之處在于它的第一個參…

cass展點不在原位置,cass中打開一副圖后,通過繪圖處理-——展高程點,怎么之前的圖形就不顯示了,,只剩下高程點!!...

答&#xff1a;1、進入控制面板&#xff0c;選擇“卸載或更改程序”。 2、選中“AutoCAD2006”圖標。 3、右擊選擇“更改”。 4、進入“AutoCAD2006安裝程序對話框”&#xff0c;選擇“添加/刪除功能”單選按鈕&#xff0c;點擊下一步。 5、在“程序文件”列表中&#xff0c;選…

(二)windows下安裝PHPCMS V9

一、準備工作 搭建環境 &#xff1a;參考:Windows下搭建PHP開發環境及相關注意事項PHPCMS V9 &#xff1a;下載適合自己 PHPCMS V9 版本到本地或服務器&#xff0c;下載地址&#xff1a;http://www.phpcms.cn/html/download/說明&#xff1a;官方提供了 2 種不同的編碼。包括 G…

JavaFX 2.0布局窗格– HBox和VBox

如果要對JavaFX 2.0中所有不同的布局窗格進行概述&#xff0c;或者想了解有關它們的一些基本知識&#xff0c;請參閱我以前的文章《 JavaFX 2.0中的布局窗格》 。 布局窗格HBox和VBox絕對是JavaFX 2.0中最基本的布局容器。 如您所知&#xff0c;它們的用途是將所有子級布置在一…

flask mysql分頁,Flask分頁的實現方法

所需環境Flask-SQLAlchemy分頁使用Flask-SQLAlchemy提供的pagination()方法。頁數是pagination()方法的第一個參數&#xff0c;也是唯一必須的參數。可選參數per_page用來指定每頁顯示的記錄數。參考代碼&#xff1a;def index():# ...page request.args.get(page, 1, typeint…

Java中的生成器設計模式

Java 中的 Builder設計模式是一種創建模式&#xff0c;即用于創建對象&#xff0c;類似于 工廠方法設計模式 &#xff0c;這也是創建設計模式。 在學習任何設計模式之前&#xff0c;我建議先找出特定設計模式要解決的問題。 眾所周知&#xff0c; 必要性是發明的母親。 在沒有面…

驗證碼( 隨機數)

方式一&#xff08;變色版&#xff09;&#xff1a; <html> <head><meta charset"UTF-8"/><title></title><script src"jquery-2.0.2.min.js"></script> </head> <body> <?php header("co…

單片機串行通信全解析

1.什么是串行通信&#xff1f; 串行通信&#xff08;英語&#xff1a;Serial communication&#xff09;是指在計算機總線或其他數據通道上&#xff0c;每次傳輸一個位元數據&#xff0c;并連續進行以上單次過程的通信方式。與之對應的是并行通信&#xff0c;它在串行端口上通過…

java type 類型,java中的泛型類型與Type接口

假設我們定義了一個Room的類&#xff0c;表示一個房間public classRoom(){}由于我們建造好房間是&#xff0c;不知道房間以后的用途&#xff0c;他可能用來住人&#xff0c;也有可能用來放貨物&#xff0c;因此需要用到泛型。但是我們可能想獲取Room這個房間里面進來的的東西的…