java.lang.ClassNotFoundException:如何解決

本文適用于當前面臨java.lang.ClassNotFoundException挑戰的Java初學者。 它將為您提供此常見Java異常的概述,這是一個示例Java程序,可支持您的學習過程和解決策略。

如果您對與更高級的類加載器相關的問題感興趣,我建議您復習有關java.lang.NoClassDefFoundError的文章系列,因為這些Java異常密切相關。

java.lang.ClassNotFoundException:概述

根據Oracle文檔,在類加載調用失敗后,將使用其字符串名稱引發ClassNotFoundException ,如下所示:

  • Class.forName方法
  • ClassLoader.findSystemClass方法
  • ClassLoader.loadClass方法

換句話說,這意味著一個特定的Java類找不到或無法從您的應用程序當前上下文類加載器“運行”加載。

對于Java初學者來說,這個問題可能特別令人困惑。 這就是為什么我始終建議Java開發人員學習和完善他們在Java類加載器方面的知識的原因。 除非您參與動態類加載和使用Java Reflection API,否則您遇到的ClassNotFoundException錯誤不是來自應用程序代碼,而是來自引用API。 另一個常見的問題模式是錯誤包裝您的應用程序代碼。 我們將在本文結尾處回到解決策略。

java.lang。 ClassNotFoundException :示例Java程序

現在在下面找到一個非常簡單的Java程序,該程序通過Class.forName()和ClassLoader.loadClass()模擬兩種最常見的ClassNotFoundException方案。 請簡單地復制/粘貼并使用您選擇的IDE運行該程序( 此示例使用Eclipse IDE )。

Java程序允許您根據以下情況在問題場景1或問題場景2之間進行選擇。 根據您要研究的場景,只需更改為1或2。

#Class.forName()

private static final int PROBLEM_SCENARIO = 1;

#ClassLoader.loadClass()

private static final int PROBLEM_SCENARIO = 2;

#ClassNotFoundExceptionSimulator

package org.ph.javaee.training5;/*** ClassNotFoundExceptionSimulator* @author Pierre-Hugues Charbonneau**/
public class ClassNotFoundExceptionSimulator {private static final String CLASS_TO_LOAD = "org.ph.javaee.training5.ClassA";private static final int PROBLEM_SCENARIO = 1;/*** @param args*/public static void main(String[] args) {System.out.println("java.lang.ClassNotFoundException Simulator - Training 5");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com");switch(PROBLEM_SCENARIO) {// Scenario #1 - Class.forName()case 1:System.out.println("\n** Problem scenario #1: Class.forName() **\n");try {Class<?> newClass = Class.forName(CLASS_TO_LOAD);System.out.println("Class "+newClass+" found successfully!");} catch (ClassNotFoundException ex) {ex.printStackTrace();System.out.println("Class "+CLASS_TO_LOAD+" not found!");} catch (Throwable any) {                           System.out.println("Unexpected error! "+any);}break;// Scenario #2 - ClassLoader.loadClass()case 2:System.out.println("\n** Problem scenario #2: ClassLoader.loadClass() **\n");                     try {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();            Class<?> callerClass = classLoader.loadClass(CLASS_TO_LOAD);Object newClassAInstance = callerClass.newInstance();System.out.println("SUCCESS!: "+newClassAInstance);} catch (ClassNotFoundException ex) {ex.printStackTrace();System.out.println("Class "+CLASS_TO_LOAD+" not found!");} catch (Throwable any) {                           System.out.println("Unexpected error! "+any);}break;}System.out.println("\nSimulator done!");}
}

#ClassA

package org.ph.javaee.training5;/*** ClassA* @author Pierre-Hugues Charbonneau**/
public class ClassA {private final static Class<ClassA> CLAZZ = ClassA.class;static {System.out.println("Class loading of "+CLAZZ+" from ClassLoader '"+CLAZZ.getClassLoader()+"' in progress...");}public ClassA() {System.out.println("Creating a new instance of "+ClassA.class.getName()+"...");doSomething();}private void doSomething() {           // Nothing to do...}
}

如果按原樣運行該程序,則每種情況的輸出如下:

#方案1輸出(基準)

java.lang.ClassNotFoundException
模擬器–訓練5

作者:Pierre-Hugues Charbonneau

http://javaeesupportpatterns.blogspot.com

**問題場景1:Class.forName()**

正在從ClassLoader'sun.misc.Launcher$AppClassLoader@bfbdb0'加載org.ph.javaee.training5.ClassA類。

成功找到類org.ph.javaee.training5.ClassA類!

模擬器完成!

#方案2輸出(基準)

java.lang.ClassNotFoundException
模擬器–訓練5

作者:Pierre-Hugues Charbonneau

http://javaeesupportpatterns.blogspot.com

**問題場景2:ClassLoader.loadClass()**

正在從ClassLoader'sun.misc.Launcher$AppClassLoader@2a340e'加載org.ph.javaee.training5.ClassA類的類…

正在創建org.ph.javaee.training5.ClassA的新實例…

成功!:org.ph.javaee.training5.ClassA@6eb38a

模擬器完成!

對于“基準”運行,Java程序能夠加載
A類
成功。

現在讓我們自愿更改的全名
A類
并針對每種情況重新運行該程序。 可以觀察到以下輸出:

#ClassA更改為ClassB

private static final String CLASS_TO_LOAD = "org.ph.javaee.training5.ClassB";

#方案1輸出(問題復制)

java.lang.ClassNotFoundException
模擬器–訓練5

作者:Pierre-Hugues Charbonneau

http://javaeesupportpatterns.blogspot.com

**問題場景1:Class.forName()**

java.lang.ClassNotFoundException
:org.ph.javaee.training5.ClassB

在java.net.URLClassLoader $ 1.run(
URLClassLoader.java:366

在java.net.URLClassLoader $ 1.run(
URLClassLoader.java:355

在java.security.AccessController.doPrivileged(
本機方法

在java.net.URLClassLoader.findClass(
URLClassLoader.java:354

在java.lang.ClassLoader.loadClass(
ClassLoader.java:423

在sun.misc.Launcher $ AppClassLoader.loadClass(
Launcher.java:308

在java.lang.ClassLoader.loadClass(
ClassLoader.java:356

在java.lang.Class.forName0(
本機方法

在java.lang.Class.forName(
Class.java:186

在org.ph.javaee.training5.ClassNotFoundExceptionSimulator.main(
ClassNotFoundExceptionSimulator.java:29

找不到org.ph.javaee.training5.ClassB類!

模擬器完成!

#方案2輸出(問題復制)

java.lang.ClassNotFoundException
模擬器–訓練5

作者:Pierre-Hugues Charbonneau

http://javaeesupportpatterns.blogspot.com

**問題場景2:ClassLoader.loadClass()**

java.lang.ClassNotFoundException
:org.ph.javaee.training5.ClassB

在java.net.URLClassLoader $ 1.run(
URLClassLoader.java:366

在java.net.URLClassLoader $ 1.run(
URLClassLoader.java:355

在java.security.AccessController.doPrivileged(
本機方法

在java.net.URLClassLoader.findClass(
URLClassLoader.java:354

在java.lang.ClassLoader.loadClass(
ClassLoader.java:423

在sun.misc.Launcher $ AppClassLoader.loadClass(
Launcher.java:308

在java.lang.ClassLoader.loadClass(
ClassLoader.java:356

在org.ph.javaee.training5.ClassNotFoundExceptionSimulator.main(
ClassNotFoundExceptionSimulator.java:51

找不到org.ph.javaee.training5.ClassB類!

模擬器完成!

發生了什么? 好吧,因為我們將完整的類名更改為org.ph.javaee.training5.ClassB,所以在運行時找不到此類(不存在),從而導致Class.forName()和ClassLoader.loadClass()調用均失敗。

您還可以通過將該程序的每個類打包到其自己的JAR文件中,然后從主類路徑中省略包含ClassA.class的jar文件來復制此問題。請嘗試一下并親自查看結果…(提示:NoClassDefFoundError)

現在,讓我們跳到解決策略。

java.lang。 ClassNotFoundException
:解決策略

現在您已經了解了這個問題,現在該解決它了。 解決方法可能非常簡單,也可能非常復雜,具體取決于根本原因。

  • 不要太過復雜的根本原因,首先要排除最簡單的原因。
  • 首先根據上述內容檢查java.lang.ClassNotFoundException堆棧跟蹤,并確定在運行時未正確加載哪個Java類,例如應用程序代碼,第三方API,Java EE容器本身等。
  • 確定調用者,例如您在調用Class.forName()或ClassLoader.loadClass()之前從堆棧跟蹤中看到的Java類。 與第三方API相比,這將有助于您了解應用程序代碼是否出錯。
  • 確定您的應用程序代碼是否未正確打包,例如,類路徑中缺少JAR文件
  • 如果缺少的Java類不是來自您的應用程序代碼,請確定它是否屬于您正在按照Java應用程序使用的第三方API。 一旦識別出它,就需要將丟失的JAR文件添加到運行時類路徑或Web應用程序WAR / EAR文件中。
  • 如果在多次解析嘗試后仍然掙扎,則可能意味著更復雜的類加載器層次結構問題。 在這種情況下,請查看我的NoClassDefFoundError文章系列,以獲取更多示例和解決方案

我希望本文能幫助您理解和重新了解這種常見的Java異常。

如果您仍在努力解決java.lang.ClassNotFoundException問題,請隨時發表任何評論或問題。

參考: java.lang.ClassNotFoundException:如何從Java EE支持模式和Java教程博客的JCG合作伙伴 Pierre-Hugues Charbonneau 解決 。

翻譯自: https://www.javacodegeeks.com/2012/11/java-lang-classnotfoundexception-how-to-resolve.html

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

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

相關文章

iOS10 App跳轉到系統設置

實現類似萬能鑰匙中點擊一個Wi-Fi跳轉到系統Wi-Fi設置界面的功能。 NSString * urlString "App-Prefs:rootWIFI";if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {if ([[UIDevice currentDevice].systemVersion doubleValue…

python生成器 圖片分類_python批量處理圖片圖片Python迭代器和生成器介紹

Python迭代器和生成器介紹迭代器迭代器是一個實現了迭代器協議的對象&#xff0c;Python中的迭代器協議就是有next方法的對象會前進到下一結果&#xff0c;而在一系列結果的末尾是&#xff0c;則會引發StopIteration。在for循環中&#xff0c;Python將自動調用工廠函數iter()獲…

Java-IO流之BufferedReader 和BufferedWriter的使用和原理

BufferedReader和BufferedWriter出現的目的是為了對FileReader以及FileWriter的讀寫操作進行增強&#xff0c;而怎么增強呢&#xff0c;原理類似于使用StringBuilder&#xff0c;是把數據先放入他們的一個char數組中&#xff0c;然后再操作char數組。 使用緩沖區的字符流是使用…

小程序實踐(三):九宮格實現及item跳轉

效果圖&#xff1a; 實現效果圖紅色線包含部分的九宮格效果&#xff0c;并附帶item點擊時間。 ------------------------------------------------------------------------------------------------------ 具體實現&#xff1a; 1、首先添加圖片資源文件 在項目根目錄新建一個…

用JavaFX編寫圖塊引擎

隨著JavaFX嵌入式版本的問世&#xff0c;我們的框架對于游戲開發變得越來越有趣&#xff0c;因為我們現在可以瞄準平板電腦和智能手機等小型消費類設備。 因此&#xff0c;我決定對JavaFX進行更多的游戲編寫實驗。 這次&#xff0c;我想使用Canvas對渲染進行更多控制&#xff0…

python命令行運行模式_[Python] 命令行模式閱讀博客園的博文

1 #-*- coding:UTF-8 -*-2 importrequests3 from lxml importetree4 importsys5 importio6 importos789 sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodinggb18030)101112 classCnBlogs:13 """"14 Auth&#xff1a;reader15 發表地址&#xff1a;…

HTML5--應用網頁模板

因為剛開始寫博客,只想著把知識點記錄在這,也想給你們一些參考,在布局上有些沒有思考太多;回過頭來看,實在是不忍直視,對不住之前閱讀的100 ,既然昨天的事無法挽回,那就從現在開始從新整改吧!也希望大家看了,能對你們有所幫助 1.先給大家看看效果圖,好讓大家有點興趣 2.大家再來…

企業集成模式簡介

在此博客文章中&#xff0c;我們將介紹一些企業集成模式。 這些是旨在解決集成挑戰的已知設計模式。 閱讀此書后&#xff0c;您將可以設計集成解決方案。 EIP&#xff08;簡而言之&#xff09;是已知的設計模式&#xff0c;可為應用程序集成過程中遇到的問題/問題提供解決方案…

手把手教你Chrome瀏覽器安裝Postman(含下載云盤鏈接)【轉載】

轉載自&#xff1a;http://www.ljwit.com/archives/php/278.html 說明&#xff1a; Postman不多介紹&#xff0c;是一款功能強大的網頁調試與發送網頁HTTP請求的Chrome插件。本文主要介紹下安裝過程。 本文使用的是解壓文件直接進行安裝。是比較快速有效的安裝方式&#xff0c;…

C語言博客作業--數據類型

題目1&#xff1a;7-4 打印菱形圖案 1. 本題PTA提交列表 2. 設計思路 1.定義變量i,j,k,n;且聲明i為要打印的行數&#xff0c;j是控制輸出打印空格和星星&#xff0c;n是菱形為菱形的高 2.輸入n 3.i1&#xff0c;j1 4.先打印上半部分&#xff0c;第一行到n/21行&#xff0c;輸出…

信息隱藏將txt文件合并到jpg文件中_使用Kali Linux在圖像內隱藏機密消息—可在任何Linux發行版使用

歡迎回到“Esn技術社區”&#xff01;今天&#xff0c;我們將演示如何使用Steghide(一種可在Kali Linux上使用的流行隱寫工具)在圖像內隱藏消息。在計算機科學中&#xff0c;將信息隱藏在文件內(例如圖像&#xff0c;文檔&#xff0c;程序&#xff0c;有用數據&#xff0c;消息…

Spring 3.1,Cloud Foundry和本地開發

這篇文章將幫助您在Cloud Foundry上使用MongoDB構建Spring 3.1 Web應用程序。 除了推動Cloud Foundry之外&#xff0c;您還可以使用MongoDB實例在本地環境中進行開發。 目標 此博客發布的目標是在本地構建應用程序&#xff0c;然后發布到本地Cloud Foundry實例。 我們將利用C…

Spring MVC 簡述:從MVC框架普遍關注的問題說起

任何一個完備的MVC框架都需要解決Web開發過程中的一些共性的問題&#xff0c;比如請求的收集與分發、數據前后臺流轉與轉換&#xff0c;當前最流行的SpringMVC和Struts2也不例外。本文首先概述MVC模式的分層思想與MVC框架普遍關注的問題&#xff0c;并以此為契機結合SpringMVC的…

java方法調用機制_Java方法調用機制 - osc_bkdv2it5的個人空間 - OSCHINA - 中文開源技術交流社區...

最近在編程時&#xff0c;修改方法傳入對象的對象引用&#xff0c;并沒有將修改反映到調用方法中。奇怪為什么結果沒有變化&#xff0c;原因是遺忘了Java對象引用和內存分配機制。本文介紹3個點&#xff1a;① 該問題舉例說明② 簡要闡述Java內存區域③ 介紹JVM中方法調用的機制…

CSS染色圖標(圖片)

之前一直以為用background引入的圖標無法染色&#xff08;非字體圖標&#xff09;&#xff0c;現在才知道有黑科技可以用&#xff0c;就是利用drop-shadow。 代碼示例 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"&…

eclipse安裝java web插件

1 查看eclipse版本 找到eclipse的安裝目錄&#xff0c;找到readme文件&#xff0c;打開其中的html文件&#xff0c;我的是4.6版本的,代號是oxygen 2 安裝 打開eclipse,點擊help-Install new software-單擊add&#xff0c;在彈出窗口中輸入網址&#xff1a; http://download.ecl…

python正則表達式指南_Python正則表達式指南

1. 正則表達式基礎1.1. 簡單介紹正則表達式并不是Python的一部分。正則表達式是用于處理字符串的強大工具&#xff0c;擁有自己獨特的語法以及一個獨立的處理引擎&#xff0c;效率上可能不如str自帶的方法&#xff0c;但功能十分強大。得益于這一點&#xff0c;在提供了正則表達…

Google Guava EventBus用于事件編程

在任何軟件應用程序中都是如此&#xff0c;有些對象需要共享信息才能完成工作。 在Java應用程序中&#xff0c;實現信息共享的一種方法是擁有事件偵聽器&#xff0c;其唯一目的是在發生所需事件時采取某些措施。 在大多數情況下&#xff0c;此過程有效&#xff0c;并且最有經驗…

system類

package system.cn; /** system類的方法 都是靜態方法&#xff0c;可以直接用類名直接調用* 常用的方法&#xff1a;* static long currentTimeMillis() 返回以毫秒為單位的當前時間。 static void exit(int status) 終止當前正在運行的 Java 虛擬機。 static void gc…

c await和java_blog/java/test/awaitility.zh.md at master · c-rainstorm/blog · GitHub

javaAtomicInteger atomic new AtomicInteger(0);// Do some async stuff that eventually updates the atomic integerawait().untilAtomic(atomic, equalTo(1));等待一個 AtomicBoolean 更簡單&#xff1a;javaAtomicBoolean atomic new AtomicBoolean(false);// Do some a…