4 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
在 Java 11 之前,要運(yùn)行代碼,您必須首先編譯它,然后才能運(yùn)行它。這是一個(gè)例子:
javac test.java
java test
從 Java 11 開(kāi)始,您仍然可以執(zhí)行javac+操作java,或者可以java單獨(dú)運(yùn)行來(lái)編譯并自動(dòng)運(yùn)行您的代碼。請(qǐng)注意,不會(huì).class生成任何文件。這是一個(gè)例子:
java test.java
如果運(yùn)行java -help,您將看到各種允許的用法。這是我的機(jī)器上的樣子。最后一個(gè)是您遇到的情況:java [options] <sourcefile> [args]它將“執(zhí)行單個(gè)源文件程序”。
$ java -help
Usage: java [options] <mainclass> [args...]
? ? ? ? ? ?(to execute a class)
? ?or? java [options] -jar <jarfile> [args...]
? ? ? ? ? ?(to execute a jar file)
? ?or? java [options] -m <module>[/<mainclass>] [args...]
? ? ? ?java [options] --module <module>[/<mainclass>] [args...]
? ? ? ? ? ?(to execute the main class in a module)
? ?or? java [options] <sourcefile> [args]
? ? ? ? ? ?(to execute a single source-file program)
我們需要javac創(chuàng)建.class文件,以便可以像今天一樣創(chuàng)建、測(cè)試、分發(fā)、運(yùn)行、共享代碼等。JEP 330的動(dòng)機(jī)是讓“學(xué)習(xí) Java 的早期階段以及編寫(xiě)小型實(shí)用程序”變得更容易,而不改變?nèi)魏纹渌F(xiàn)有用途。

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
如果您運(yùn)行的是 Java 11,則有一項(xiàng)新功能允許執(zhí)行單個(gè)源文件。單源編譯器在類(lèi)名與文件名方面更加混雜,因此您可以運(yùn)行但無(wú)法成功編譯。
如果您使用的是以前版本的 Java,則當(dāng)前的 hello.java 不會(huì)編譯,因?yàn)榫幾g錯(cuò)誤,特別是類(lèi)名周?chē)腻e(cuò)誤。因此,調(diào)用 java hello.java 絕對(duì)不可能編譯您的代碼,因?yàn)樗鼰o(wú)法編譯。
看起來(lái)很可能您在執(zhí)行 java 命令時(shí)正在運(yùn)行一些先前編譯的代碼。

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
要回答出現(xiàn)此錯(cuò)誤的原因,文件的類(lèi)名必須與文件的basename
.
您有兩種選擇讓此代碼適用于傳統(tǒng)的javac
;java
順序:
將類(lèi)重命名為
public class Hello
或重命名
hello.java
為myclass.java
.
Java 11 的解釋java
器沒(méi)有強(qiáng)加此要求。包含的類(lèi)main
可以具有任何名稱,只要它是文件中的第一個(gè)類(lèi)即可。

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
是的,但不是你想的那樣。
當(dāng)您使用該javac
命令將 .java 文件編譯為 .class 文件時(shí),輸出稱為字節(jié)碼。字節(jié)碼是基于 Java 虛擬機(jī)規(guī)范的理論 CPU 的機(jī)器代碼(本機(jī)指令)。
此虛擬 CPU 規(guī)范是編寫(xiě)規(guī)范時(shí)常見(jiàn)的 CPU 類(lèi)型的平均值。因此,它接近許多不同類(lèi)型的 CPU,從而更容易在多種 CPU 類(lèi)型上運(yùn)行相同的 Java .class 文件。
當(dāng) Java 第一次啟動(dòng)時(shí),該java
命令將讀取 .class 文件并一次解釋一個(gè)字節(jié)碼指令,然后將它們映射到實(shí)際運(yùn)行的 CPU 的等效本機(jī)指令。這有效但不是特別快。為了改進(jìn)這一點(diǎn),Java 運(yùn)行時(shí)中添加了即時(shí) (JIT) 編譯。
通過(guò) JIT,該java
命令獲取字節(jié)碼并將其再次編譯為其運(yùn)行的 CPU 的本機(jī)指令。現(xiàn)代 Java 運(yùn)行時(shí)傾向于在后臺(tái)進(jìn)行 JIT 編譯時(shí)開(kāi)始解釋字節(jié)碼,并在準(zhǔn)備就緒時(shí)切換到已編譯的本機(jī)指令,并且還將分析正在運(yùn)行的應(yīng)用程序,然后使用不同的優(yōu)化再次重新編譯字節(jié)碼,以獲得最佳性能。
編輯(安撫反對(duì)者):
因此,在您的特定情況下(因?yàn)槟\(yùn)行的是比 v11 更新的 JRE),代碼會(huì)(至少)編譯兩次
作為字節(jié)碼的單個(gè) .java 文件
通過(guò) JIT 編譯器解釋字節(jié)碼(盡管對(duì)于 helloWorld,它實(shí)際上可能沒(méi)有時(shí)間運(yùn)行任何已編譯的本機(jī)代碼)
添加回答
舉報(bào)