文档

Java™ 教程
路径:基本的Java类
课程:平台环境
首页 > 基本的Java类 > 平台环境

问题和练习的答案:平台环境

问题

问题 1.一位程序员安装了一个包含在.jar文件中的新库。为了从他的代码中访问该库,他将CLASSPATH环境变量设置为指向新的.jar文件。现在他发现当他尝试运行简单的应用程序时,会收到一个错误消息:

java Hello
Exception in thread "main" java.lang.NoClassDefFoundError: Hello

在这种情况下,Hello类被编译成一个在当前目录中的.class文件,然而java命令似乎找不到它。出了什么问题?

回答 1.只有当类出现在类路径中时,才能找到它。默认情况下,类路径包括当前目录。如果设置了CLASSPATH环境变量,并且不包括当前目录,启动器将无法在当前目录中找到类。解决方法是将CLASSPATH变量更改为包括当前目录。例如,如果CLASSPATH的值是c:\java\newLibrary.jar(Windows)或/home/me/newLibrary.jar(UNIX或Linux),它需要更改为.;c:\java\newLibrary.jar.:/home/me/newLibrary.jar

练习

练习 1.

编写一个应用程序PersistentEcho,具有以下特点:

回答 1.

import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class PersistentEcho {
    public static void main (String[] args) {
        String argString = "";
        boolean notProperty = true;

        // 是否有参数?
        // 如果有,获取它们。
        if (args.length > 0) {
            for (String arg: args) {
                argString += arg + " ";
            }
            argString = argString.trim();
        }
        // 没有参数,有环境变量吗?
        // 如果有,获取它。
        else if ((argString = System.getenv("PERSISTENTECHO")) != null) {}
        // 也没有环境变量。获取属性值。
        else {
            notProperty = false;
            // 将argString设置为null。
            // 如果在退出try块后仍然为null,
            // 则表示无法获取属性值。
            argString = null;
            FileInputStream fileInputStream = null;
            try {
                fileInputStream =
                    new FileInputStream("PersistentEcho.txt");
                Properties inProperties
                    = new Properties();
                inProperties.load(fileInputStream);
                argString = inProperties.getProperty("argString");
            } catch (IOException e) {
                System.err.println("无法读取属性文件。");
                System.exit(1);
            } finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch(IOException e) {};
                }
            }
        }
        if (argString == null) {
            System.err.println("找不到argString属性");
            System.exit(1);
        }

        // 无论如何,我们都得到了
        // 值。现在就打印出来!
        System.out.println(argString);

        // 如果我们没有从属性中获取
        // 值,将它保存在属性中。
        if (notProperty) {
            Properties outProperties =
                new Properties();
            outProperties.setProperty("argString",
                                      argString);
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream =
                    new FileOutputStream("PersistentEcho.txt");
                outProperties.store(fileOutputStream,
                        "PersistentEcho属性");
            } catch (IOException e) {}
            finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch(IOException e) {};
                }
            }
        }
    }
}


前一页:问题与练习:平台环境