最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java命令行運(yùn)行錯(cuò)誤之找不到或無(wú)法加載主類問(wèn)題的解決方法

 更新時(shí)間:2022年01月25日 11:22:42   作者:明月幾時(shí)有666  
這篇文章主要給大家介紹了關(guān)于Java命令行運(yùn)行錯(cuò)誤之找不到或無(wú)法加載主類問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言:

雖然學(xué)習(xí)Java語(yǔ)言約有兩年多,但在最近需要使用命令行工具編譯并運(yùn)行Java程序時(shí),還是報(bào)錯(cuò)了。花費(fèi)了一些時(shí)間,解決了該問(wèn)題,發(fā)現(xiàn)解決方法在初學(xué)Java時(shí)使用過(guò)。一則,為了避免以后再出現(xiàn)同樣的問(wèn)題而浪費(fèi)不必要的時(shí)間;二則,作為使用該語(yǔ)言的程序員,對(duì)于該語(yǔ)言的一些基本問(wèn)題,應(yīng)該有清晰的理解和認(rèn)識(shí);三則,網(wǎng)上的一些解決方案,不夠完備。有的沒(méi)有解釋問(wèn)題原因,直接給出答案;有的,未列舉出某些常見情況的解決方案。因此,寫此文章,讓讀者可以舉一反三,深入理解問(wèn)題。

一、 問(wèn)題分析

找不到或無(wú)法加載主類,主要原因有兩個(gè):

1. 類名錯(cuò)誤

2. 類所在位置未添加至類加載路徑中

二、 問(wèn)題解決

本部分將針對(duì)在“一”中提出的兩個(gè)問(wèn)題發(fā)生原因,分別進(jìn)行分析及處理。并且會(huì)介紹java的一些和處理問(wèn)題相關(guān)的基本概念。

1. 類名錯(cuò)誤

全限定類名:包名+類名。另外,當(dāng)包名為空時(shí)(即代碼不包含package語(yǔ)句),稱類所在包為默認(rèn)包

例如,以下代碼的全限定類名為:“com.gzn.demo.HelloWorld”

// 文件名HelloWorld.java
package com.gzn.demo;
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("hello world");
    }
}

在運(yùn)行java程序時(shí),全限定類名可以唯一確定該文件,就像是文件系統(tǒng)中路徑(相當(dāng)包名)+文件名(相當(dāng)類名)可以唯一確定一個(gè)文件一樣。本質(zhì)上包名發(fā)揮的作用和文件系統(tǒng)中的目錄相同,有利于文件分隔避免重名。

現(xiàn)在存在一個(gè)問(wèn)題,Java是如何識(shí)別一個(gè)類文件的包名的?

實(shí)際上,包名的識(shí)別是通過(guò)文件系統(tǒng)的目錄實(shí)現(xiàn)的 。例如,上文提到的包名為“com.gzn.demo”的HelloWorld.java文件,該文件在文件系統(tǒng)中的位置為 “com\gzn\demo”,編譯后的HelloWorld.class也在"com\gzn\demo"目錄下,因此,在運(yùn)行java程序后加載類時(shí),只需在“com\gzn\demo”目錄下,查看是否存在要查找的文件即可。簡(jiǎn)而言之,目錄(或路徑)名于包名存在一一映射的關(guān)系,可認(rèn)為相等。

在Windows操作系統(tǒng)的命令行下,運(yùn)行Java代碼的語(yǔ)法格式為,注意,此時(shí)java命令位于目錄com的上一級(jí)目錄(一般為項(xiàng)目的目錄名);類名不能包含擴(kuò)展名.class

Java 全限定類名
例如java com.gzn.demo.HelloWorld;包名為空則為java HelloWorld

Windows操作系統(tǒng)中還有另一種語(yǔ)法格式(其他系統(tǒng)未必可以),不常用,使用反斜杠代替了點(diǎn)好,之所以沒(méi)用正斜杠,個(gè)人猜測(cè)是為了和系統(tǒng)的文件分隔符進(jìn)行區(qū)分:

例如Java com/gzn/demo/HelloWorld; 包名為空則為java HelloWorld

可能出錯(cuò)情況一 :在命令行運(yùn)行java程序時(shí),類名包含了擴(kuò)展名

在helloworld項(xiàng)目目錄下運(yùn)行java命令,HelloWorld.class文件在“com\gzn\demo”目錄下,即包名為com.gzn.demo,上文已介紹,不在贅述。
C:\Users\gzn\helloworld>java com.gzn.demo.HelloWorld.class

或者包名為空
C:\Users\gzn\helloworld> java HelloWorld.class
上述寫法,會(huì)出現(xiàn)報(bào)錯(cuò),原因是它不符號(hào)java運(yùn)行程序的語(yǔ)法格式,java可能把“HelloWorld.class”作為一個(gè)整體類名處理,那么要查找的文件可能是“HelloWorld.class.class”,顯然是找不到的。

可能出錯(cuò)情況二 :運(yùn)行Java命令時(shí)未指明全限定類名的包名部分或指明了包名但Java命令運(yùn)行的位置不正確

假設(shè)HelloWorld.class,包名為com.gzn.demo,所在位置為: C:\Users\gzn\helloworld\com\gzn\demo

運(yùn)行以下命令
C:\Users\gzn\helloworld\com\gzn\demo>java HelloWorld
運(yùn)行命令后,會(huì)在當(dāng)前目錄下,查找并讀取該文件后,發(fā)現(xiàn)該類為“com.gzn.demo.HelloWorld”(全限定類名唯一確定一個(gè)類,上文已介紹)與我要運(yùn)行的類“HelloWorld”并不是同一類,因此,找不到要運(yùn)行的類。

于是,很自然的一個(gè)想法是運(yùn)行以下命令
C:\Users\gzn\helloworld\com\gzn\demo>java com.gzn.demo.HelloWorld
包名和文件名是一一映射的(上文已介紹),運(yùn)行命令后,會(huì)從命令所在位置開始(即以命令所在位置為相對(duì)路徑),查找“com\gzn\demo\”路徑下的HelloWorld文件。由于“C:\Users\gzn\helloworld\com\gzn\demo”路徑下根本不存在目錄“com”(更不用說(shuō)gzn\demo),因此,找不到運(yùn)行的類。

正確的運(yùn)行命令的方法,呼之欲出,只需改變命令的運(yùn)行位置即可,如下所示
C:\Users\gzn\helloworld>java com.gzn.demo.HelloWorld
運(yùn)行命令后,會(huì)在“com\gzn\demo”路徑下找到并讀取HelloWorld文件,發(fā)現(xiàn)該類的全限定名為“com.gzn.demo.HelloWorld”,查找的類正是Java想要運(yùn)行的類。

以上是比較初級(jí)的出錯(cuò)情況,下文將要介紹相對(duì)比較高級(jí)的出錯(cuò)情況,這也是其他博文未曾給出解決方案的情況。同時(shí)還會(huì)介紹classpath的概念,及使用方法。加油!

2. 類所在位置未添加至類加載路徑中

類加載路徑(Classpath):當(dāng)你的程序依賴第三方或者自己寫的類文件時(shí),需要指出上述文件的所在位置,即類加載路徑。Java虛擬機(jī)的類加載器會(huì)在你指定的路徑中,查找你的程序所依賴的類文件(依賴的類文件 在import語(yǔ)句中指定)

classpath可以通過(guò)以下兩種方式指定:

方式一:配置環(huán)境變量

  這種方式是初學(xué)Java者肯定了解的方式,通常在下載完JDK后就會(huì)進(jìn)行配置。然而在JDK1.5之后,官方已不建議使用這種方式來(lái)指定類加載路徑,原因后文擴(kuò)展部分會(huì)談及。

說(shuō)明:“.”表示在當(dāng)前目錄,即java等命令運(yùn)行時(shí)所在目錄;

dt.jar是關(guān)于運(yùn)行環(huán)境的類庫(kù),主要是用于swing的包,如果不使用可以不配置;

tools.jar是工具類庫(kù),它在編譯和運(yùn)行一個(gè)類時(shí)被使用

方式二:java命令的-cp(或-classpath)參數(shù)指定(官方建議)

這種方式是JDK1.5后官方建議的方式。當(dāng)你在命令行下運(yùn)行java命令時(shí),如果沒(méi)有指定-classpath參數(shù),那么默認(rèn)使用環(huán)境變量中設(shè)置的ClASSPATH。官方建議,你在運(yùn)行每個(gè)程序時(shí),為其顯示設(shè)置所依賴的類文件所在的位置,而不是使用“全局”性質(zhì)的環(huán)境變量中CLASSPATH。一旦你運(yùn)行程序時(shí)指定了-classpath參數(shù),環(huán)境變量中的CLASSPATH就不會(huì)在使用,而是使用你參數(shù)的classpath。實(shí)際上,JDK1.5以后,官方已經(jīng)不建議配置CLASSPATH環(huán)境變量。

語(yǔ)法格式如下:

java -cp <路徑1;路徑2;…> 全限定類名

路徑:依賴的文件所在的絕對(duì)路徑(或相對(duì)路徑),如果類文件在jar包中,路徑后還要寫上jar包的名字,例如“C:\users\gzn\mylib\algs4.jar”
注意,“.”代表當(dāng)前路徑,即java命令運(yùn)行時(shí)所在路徑。

可能出錯(cuò)情況三 :存在依賴外部jar包時(shí),命令行運(yùn)行java命令,classpath參數(shù)中只是添加了外部jar包路徑,沒(méi)有添加當(dāng)前目錄“.”,導(dǎo)致要運(yùn)行的類文件找不到。

或者,程序在IDE(eclipse、IDEA等)開發(fā)工具中可以運(yùn)行,但是在命令行下不能運(yùn)行,情況相同。

在某篇高贊博文中,依然存在的問(wèn)題

下面,通過(guò)問(wèn)題在現(xiàn)的方式,講解解決方法。

項(xiàng)目簡(jiǎn)介:HelloWorld.java程序,位置“C:\Users\gzn\helloworld\com\gzn\demo”,依賴algs4.jar(位置C:\Users\gzn\helloworld)中的edu.princeton.cs.algs4.StdOut類,調(diào)用了該類的print函數(shù),其API如下

public class StdOut
public static void print(String s); 打印輸出指定的字符串

HelloWorld.java

package com.gzn.demo;
import edu.princeton.cs.algs4.StdOut;

public class HelloWorld {
	public static void main(String args[]) {
		StdOut.print("Hello World!");
	}
}

項(xiàng)目結(jié)構(gòu)如下圖所示:

在命令行運(yùn)行程序時(shí),存在外部依賴,不僅要在-cp (或-classpath)中指明依賴的路徑,還有把當(dāng)前路徑加進(jìn)去。因?yàn)楫?dāng)你指定了-classpath參數(shù)后,環(huán)境變量失效,于是環(huán)境變量CLASSPATHY中設(shè)置的當(dāng)前目錄“.”也就不能用了。虛擬機(jī)類加載器加載類的路徑只能在classpath類加載路徑指明的位置中查找,如果路徑中沒(méi)有添加當(dāng)前目錄“.”,也就是當(dāng)前要運(yùn)行的類所在位置沒(méi)有添加到類加載路徑中,顯然會(huì)查找不到類。解決方法如下圖所示:

三、擴(kuò)展知識(shí)

1. JDK目錄結(jié)構(gòu)及環(huán)境變量介紹

JDK目錄介紹

初學(xué)者環(huán)境變量配置如下:

變量名
CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tool.jar (注,jdk1.5后無(wú)需配置)
JAVA_HOMED:\jdk8(JDK安裝目錄,視個(gè)人安裝情況而定)
Path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

Path為命令行工具指定命令的查找路徑。命令的本質(zhì)是可執(zhí)行程序,設(shè)置后可以在命令行工具下運(yùn)行java、javac、javah等常用的命令;
JAVA_HOME 指定了JDK(Java開發(fā)工具包)路徑。設(shè)置后,無(wú)論是編譯還是運(yùn)行程序,類加載器都會(huì)從相應(yīng)的目錄中加載需要的類庫(kù)。如運(yùn)行javac編譯命令,會(huì)從”%JAVA_HOME%\lib\tool.jar”加載需要的類;通過(guò)java命令運(yùn)行程序,會(huì)從“%JAVA_HOME%\jre\lib\rt.jar”加載程序依賴的類;Java虛擬機(jī)會(huì)從“%JAVA_HOME%\jre\lib\ext\”加載依賴的類。

jdk中的函數(shù)庫(kù)lib稱為Java的標(biāo)準(zhǔn)庫(kù),指定了JAVA_HOME環(huán)境變量后就可以使用了,編譯和運(yùn)行會(huì)自動(dòng)在相應(yīng)位置查找依賴的類。而第三方庫(kù)(如mysql-connector-java-5.1.40.jar)和用戶自己定義的類庫(kù) 在編譯和運(yùn)行時(shí),需要在-cp類加載路徑參數(shù)中指明庫(kù)的位置。

2. 為什么jdk1.5后不需要配置環(huán)境變量了?

此部分內(nèi)容參考自Java開發(fā)環(huán)境不再需要配置classpath

在JDK1.5之前,是沒(méi)有辦法在當(dāng)前目錄下加載類的(找不到 JDK目錄下lib文件夾中的.jar文件),所以我們需要通過(guò)配置classpath,但JDK1.5之后,JRE能自動(dòng)搜索目錄下類文件,并且加載dt.jar和tool.jar的類。

The class path tells the JDK tools and applications where to find third-party and user-defined classes that are not extensions or part of the Java platform. See The Extension Mechanism at
類路徑告訴JDK工具和應(yīng)用程序在哪里可以找到第三方和用戶定義的類,這些類既不是Java平臺(tái)的擴(kuò)展,也不是Java平臺(tái)的一部分。參見擴(kuò)展機(jī)制

If you upgrade from an earlier release of the JDK, then your startup settings might include CLASSPATH settings that are no longer needed. You should remove any settings that are not application-specific, such as classes.zip. Some third-party applications that use the Java Virtual Machine (JVM) can modify your CLASSPATH environment variable to include the libraries they use. Such settings can remain.

如果您從JDK的早期版本升級(jí),那么您的啟動(dòng)設(shè)置可能包括不再需要的類路徑設(shè)置。您應(yīng)該刪除任何與應(yīng)用程序無(wú)關(guān)的設(shè)置,比如classes.zip。一些使用Java虛擬機(jī)(JVM)的第三方應(yīng)用程序可以修改類路徑環(huán)境變量,以包含它們使用的庫(kù)。這樣的設(shè)置可以保留。

You can change the class path by using the -classpath or -cp option of some Java commands when you call the JVM or other JDK tools or by using the CLASSPATH environment variable. See JDK Commands Class Path Options. Using the -classpath option is preferred over setting the CLASSPATH environment variable because you can set it individually for each application without affecting other applications and without other applications modifying its value. See CLASSPATH Environment Variable.

在調(diào)用JVM或其他JDK工具時(shí),可以使用一些Java命令的-classpath或-cp選項(xiàng),或者使用CLASSPATH環(huán)境變量,來(lái)更改類路徑。參見JDK命令類路徑選項(xiàng)。使用-classpath選項(xiàng)優(yōu)于設(shè)置CLASSPATH環(huán)境變量,因?yàn)槟梢詾槊總€(gè)應(yīng)用程序單獨(dú)設(shè)置它,而不影響其他應(yīng)用程序,也不需要其他應(yīng)用程序修改它的值。參見CLASSPATH環(huán)境變量。

Java開發(fā)環(huán)境不再需要配置classpath!

總結(jié) 

到此這篇關(guān)于Java命令行運(yùn)行錯(cuò)誤之找不到或無(wú)法加載主類問(wèn)題的文章就介紹到這了,更多相關(guān)Java找不到或無(wú)法加載主類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java static方法用法實(shí)戰(zhàn)案例總結(jié)

    Java static方法用法實(shí)戰(zhàn)案例總結(jié)

    這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 線程池ThreadPoolExecutor并行處理實(shí)現(xiàn)代碼

    線程池ThreadPoolExecutor并行處理實(shí)現(xiàn)代碼

    這篇文章主要介紹了線程池ThreadPoolExecutor并行處理實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java 函數(shù)式編程要點(diǎn)總結(jié)

    Java 函數(shù)式編程要點(diǎn)總結(jié)

    函數(shù)式編程并不是Java新提出的概念,其與指令編程相比,強(qiáng)調(diào)函數(shù)的計(jì)算比指令的計(jì)算更重要;與過(guò)程化編程相比,其中函數(shù)的計(jì)算可以隨時(shí)調(diào)用。Java8新引入函數(shù)式編程方式,大大的提高了編碼效率。本文將對(duì)涉及的對(duì)象等進(jìn)行統(tǒng)一的學(xué)習(xí)及記錄。
    2021-06-06
  • Java繼承超詳細(xì)教程

    Java繼承超詳細(xì)教程

    繼承是面向?qū)ο笳Z(yǔ)法的三大特征之一,繼承可以降低代碼編寫的冗余度,提高編程的效率,通過(guò)繼承,子類獲得了父類的成員變量和方法,一個(gè)子類如何繼承父類的字段和方法,如何修改從父類繼承過(guò)來(lái)的子類的方法呢,今天我們開始學(xué)習(xí)有關(guān)Java繼承的知識(shí),感興趣的朋友一起看看吧
    2023-11-11
  • java實(shí)現(xiàn)策略模式使用示例

    java實(shí)現(xiàn)策略模式使用示例

    在使用圖像處理軟件處理圖片后,需要選擇一種格式進(jìn)行保存。然而各種格式在底層實(shí)現(xiàn)的算法并不相同,這剛好適合策略模式。編寫程序,演示如何使用策略模式與簡(jiǎn)單工廠模式組合進(jìn)行開發(fā)
    2014-02-02
  • 詳解Java 自動(dòng)裝箱與拆箱的實(shí)現(xiàn)原理

    詳解Java 自動(dòng)裝箱與拆箱的實(shí)現(xiàn)原理

    本篇文章主要介紹了詳解Java 自動(dòng)裝箱與拆箱的實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?

    基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?

    這篇文章主要介紹了基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取,文章圍繞主題相關(guān)資料展開詳細(xì)內(nèi)容,具有一的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • Netty源碼分析NioEventLoop執(zhí)行select操作入口

    Netty源碼分析NioEventLoop執(zhí)行select操作入口

    這篇文章主要介紹了Netty源碼分析NioEventLoop執(zhí)行select操作入口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 使用IDEA配置Maven搭建開發(fā)框架ssm教程

    使用IDEA配置Maven搭建開發(fā)框架ssm教程

    這篇文章主要為大家詳細(xì)介紹了使用IDEA配置Maven搭建開發(fā)框架ssm教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法

    idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法

    這篇文章主要介紹了idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

松阳县| 庐江县| 奉节县| 扶风县| 达日县| 德保县| 陵川县| 新乐市| 肃宁县| 宁河县| 彭水| 潍坊市| 兰溪市| 泾阳县| 仁布县| 连山| 神农架林区| 河曲县| 涟源市| 天水市| 新巴尔虎右旗| 墨竹工卡县| 楚雄市| 华坪县| 伽师县| 绥棱县| 扶余县| 台州市| 上栗县| 尼勒克县| 汝南县| 德保县| 宁阳县| 九台市| 阳原县| 曲松县| 抚州市| 桃园县| 博野县| 万年县| 临桂县|