P198.
已知目录D:/WorkSpace/Java/5 下,有包Geometry和文件夹TryPackage,包Geometry中含有java文件Line,Point。文件夹TryPackage下含有java文件TryPackage,该文件需要引用Geometry. 源文件如下:
import Geometry.*; // Import the Point and Line classes
public class TryPackage {
public static void main(String[] args) {
double[][] coords= {{1.0, 0.0}, {6.0, 0.0}, {6.0, 10.0}, {10.0, 10.0}, {10.0, -14.0}, {8.0, - 14.0}};
// Create an array of points an fil it with Point objects
Point[] points = new Point[coords.length];
for (int i = 0; i < coords.length; i++) {
points[i] = new Point(coords[i][0], coords[i][1]);
}
Line[] lines = new Line[points.length - 1];
double totalLength = 0.0; // Store total line length here
for (int i = 0; i < points.length -1; i++) {
lines[i] = new Line(points[i], points[i+1]); // Create a Line
totalLength += lines[i].length(); // Add its length
System.out.println("Line " + (i+1) + " " + lines[i] + " Length is " + lines[i].length());
}
// Output the total length
System.out.println("/nTotal line length = " + totalLength);
}
}
在编译过程中,命令行当前路径为:D:/WorkSpace/Java/5 ,执行以下命令:
D:/WorkSpace/Java/5 >set classpath=D:/WorkSpace/Java/5
D:/WorkSpace/Java/5 >cd D:/WorkSpace/Java/5/TryPackage
D:/WorkSpace/Java/5/TryPackage >javac TryPackage.java
则编译成功,在包Geometry和文件夹TryTryPackage下都找到了相应的类文件,即编译TryPackage.java时,编译器根据classpath找到了目录D:/WorkSpace/Java/5下的包Geometry,但是,如果我们继续执行命令:
D:/WorkSpace/Java/5/TryPackage >java TryPackage
那么,编译器将报错:Exception in thread "main" java.lang.NoClassDefFoundError: TryPackage
虽然当前目录为TryPackage.class所在目录,但是,classpath路径为D:/WorkSpace/Java/5,编译器将根据classpath值寻找类文件,而在该目录下,并没有类TryPackage,故,编译器报错。
处理方法是:在classpath中加入当前目录, 即 set classpath=.;D:/WorkSpace/Java/5
那么,我们在目录D:/WorkSpace/Java/5/TryPackage下编译TryPackage.java,再运行java TryPackage命令,则成功运行。
同样的,我们可以退出到目录D:/WorkSpace/Java/5,该目下含有包Geometry和包含有TryPackage.java文件的文件夹TryPackage,我们设置 set classpath=.;D:/WorkSpace/Java/5/TryPackage ,那么,当前路径:D:/WorkSpace/Java/5下,执行以下命令:
D:/WorkSpace/Java/5>javac TryPackage.java
则编译器根据classpath路径值,找到文件TryPackage.java并编译,而在编译过程中,又根据当前目录和classpath值,找到当前目录下的包Geometry,从而成功编译。显然,我们在当前目录下执行命令:java TryPackage 命令,虽然该目录下并没有类文件TryPackage.class,但是,编译器根据classpath路径值,找到了TryPackage文件夹下的TryPackage.class,执行成功。
缺省状态下,编译器将在当前目录下寻找 .java文件和 .class 文件以及包,故,如我们将包Geometry复制到文件夹TryPackage下,并进入该文件夹,使当前目录为: D:/WorkSpace/Java/5/TryPackage,在该目录下,编译和执行 都将成功进行。