天天看點

在Eclipse中可以運作,但在CMD中錯誤:找不到符号的解決辦法一、問題描述 二、問題原因三、解決辦法四、運作執行

一、問題描述

Java環境變量配置完成,在Eclipse中可以運作的程式,但在CMD中運作報錯:找不到符号。

 如:建立了一個要求從指令行界面輸入參數的java檔案[Driver.java]。但是這個檔案還有兩個相關檔案[Summation.java]和[MutableInteger.java]。而且主類Driver還可以輸入指令行參數。

代碼如下:

package com.zyx.chapter9.thread;

public class MutableInteger {
	private int value;
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
}
           
package com.zyx.chapter9.thread;

import com.zyx.chapter9.thread.MutableInteger;
public class Summation implements Runnable{
	private int upper;
	private MutableInteger sumValue;
	public Summation(int upper,MutableInteger sumValue) {
		this.upper = upper;
		this.sumValue = sumValue;;
	}

	@Override
	public void run() {// 執行這個代碼會,建立一個線程。
		int sum=0;
		for(int i=0;i<=upper;i++)
			sum+=i;
		sumValue.setValue(sum);
	}
}
           
package com.zyx.chapter9.thread;
import com.zyx.chapter9.thread.MutableInteger;
import com.zyx.chapter9.thread.Summation;

public class Driver {

	public static void main(String[] args) {
		if(args.length>0) {
			if(Integer.parseInt(args[0])<0)
				System.err.println(args[0]+"Must be >= 0");
			else {
				MutableInteger sum = new MutableInteger();
				int upper = Integer.parseInt(args[0]);
				// 對實作了Runnable接口的對象建立Thread對象
				Thread thread = new Thread(new Summation(upper, sum));
				thread.start();// 啟動這個線程
				// 列印線程運作結果
				try {
					thread.join(); 
					System.out.println("the sum of "+upper+" is "+sum.getValue());
				}catch (InterruptedException e) {}
			}
		}
		else {
			System.out.println("Usage:Summation<integer value>");
		}
	}
}
           

在Eclipse運作正常:(因為我沒有輸入參數)

Usage:Summation<integer value>

但是在CMD中出現了如下情形:

在Eclipse中可以運作,但在CMD中錯誤:找不到符号的解決辦法一、問題描述 二、問題原因三、解決辦法四、運作執行

 二、問題原因

這一般是由于有多非JavaAPI函數庫依賴項的原因。即在你的代碼中,有很多其他自己建立的類或接口。如果單個檔案編譯,那麼就會出現問題。因為javac編譯器是要将你的代碼編譯成JVM可以識别的位元組碼,然而如果檔案中有其他非java API庫的依賴項,那麼編譯器就無法識别,那它就是一串不知道是什麼的字元串。

三、解決辦法

解決辦法就是,将所有依賴項一起編譯,按照依賴性依次往後放:

3.1 用指令行按檔案名直接編譯java檔案

在指令行,可以直接進入檔案目錄D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9\thread,然後再指令行依次或按依賴順序編譯。

D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9\thread>javac MutableInteger.java Summation.java Driver.java

3.2 用中間檔案編譯java檔案

建立一個【依賴性檔案清單】,名字無所謂,就叫source.txt吧,這些相關檔案的絕對路徑按行、按依賴性依次寫入到這個檔案,最先被依賴的檔案最先寫入。

D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9\thread\MutableInteger.java

D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9\thread\Summation.java

D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9\thread\Driver.java

這樣我們就可以直接針對這個檔案來運作,在CMD中運作如下指令:

如果你的代碼中有中文,那麼就要用GBK,當然也可以預設省略這一條。

javac -encoding GBK @source.txt -Xlint:unchecked      

四、運作執行

要從指令行,運作java程式要從它包名開始訓示。java運作時隻會從包名開始識别。可以從java檔案的第一行知道該java檔案的包名:com.zyx.chapter9.thread。

D:\eclipse-workspace\GSZJ\src\com\zyx\chapter9>java thread.Driver 10

錯誤: 找不到或無法加載主類 thread.Driver

原因: java.lang.NoClassDefFoundError: com/zyx/chapter9/thread/Driver (wrong name: thread/Driver)

D:\eclipse-workspace\GSZJ\src>java com.zyx.chapter9.thread.Driver 10

the sum of 10 is 55