【问题标题】:Error in piping java programs管道Java程序中的错误
【发布时间】:2015-06-23 15:56:57
【问题描述】:

我有一个 RandomSeq 类,它打印“args[0]”随机双精度数和一个平均类,它打印 StdIn 的平均值。我正在使用 DrJava 编写代码和编译。我已经下载了 StdIn 和 out 库并将它们放在我的类的同一个文件夹中。我正在学习Java。

第一个问题在 DrJava 的“交互”部分。当我写 java RandomSeq 10 > data.txt 而不是创建文本文件时,它会打印输出。为什么?
然后我在 Windows 命令行中输入了相同的命令。它成功创建了txt文件。

现在我想将 RandomSeq 10 的输出通过管道传输到 Average 的输入。写作java RandomSeq 10 | java Average 在 DrJava 的交互部分会导致有趣的行为。在 cmd 中写入会打印以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: StdIn
        at Average.main(Average.java:7)
Caused by: java.lang.ClassNotFoundException: StdIn
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

即使java Average < data.txt 显示相同的错误。为什么?

public class RandomSeq
{
    public static void main(String[] args)
    {
        int N = Integer.parseInt(args[0]);
        for (int i = 0; i < N; i++)
        {
            System.out.println(Math.random());
        }
    }
}




public class Average
{
    public static void main(String [] args)
    {
        double S = 0;
        int i = 0;
        while (!StdIn.isEmpty())
        {
            double n = StdIn.readDouble();
            S += n;
            i++;
        }
        S = S/i;
        //StdOut.printf("The mean is %.3f", S);
        StdOut.println(S);
    }
}

【问题讨论】:

  • StdIn 的全称是什么?它在你的类路径上吗?
  • “当我写 java RandomSeq 10 > data.txt 而不是创建文本文件” - 你在哪里写这个? :)
  • @AndyTurner 我是 Java 新手。 StdIn 的“完全限定名称”是什么意思?我从这里下载了它:introcs.cs.princeton.edu/java/15inout/StdIn.java
  • @AndyTurner 正如我所说,StdIn 和 StdOut 在我的课程的同一个文件夹中
  • @matrixanomaly 我在帖子中提到过:在 DrJava 的“交互”部分

标签: java piping drjava


【解决方案1】:

StdIn 不是来自内置 Java 库。它是第 3 方库的一部分,包含在 stdlib.jar 文件中,可以从 here 下载。

JAR 文件的路径必须在命令行javac 和java 调用的-CLASSPATH 选项中。 this page 的 使用标准库 部分向您展示了如何执行此操作; -cp 选项只是 -CLASSPATH 的简写。学习如何将库放到您的 CLASSPATH 中很重要,因为您最终会一直使用 Java。

您的Average.java 代码还必须是import StdIn 类。由于StdIn 不驻留在命名包中,您只需在代码顶部说import StdIn;。

或者,您可以只使用System.in,而不是这个库。您可能还需要一个更高级别的流结构。 Here's a nice example.

【讨论】:

  • 但是在下面“连接两个程序”部分的链接中:introcs.cs.princeton.edu/java/15inout,没有提到这些先决条件:-|
  • 没问题。我只是浓缩了我的答案以备将来使用。它将使您无需编译即可使用StdIn。
【解决方案2】:

这是related question on StdIn。 StdIn 不是标准的 java 库,正如您提到的,您正在学习普林斯顿课程,StdIn.java 由课程提供,您可能还需要编译 StdIn.java,使用命令 javac StdIn.javato生成一个StdIn.class 文件,这将解决Class not Found Exception。 (第二期)

关于你在 DrJava 中写 java RandomSeq 10 &gt; data.txt 的问题(我要求澄清,因为我没有意识到 DrJava 是一个 IDE,以为是一本书),是因为 Interactions 部分很可能直接给出程序的输入,这意味着它将您在其中输入的任何内容作为args[] 传递给您的main 函数。

输出被打印是因为您在代码中调用了system.out.println,DrJava 只是获取该输出并将其打印到屏幕上,而不是通过管道传输到您的data.txt 文件。我建议您这样做,因为您使用的课​​程材料需要管道​​等内容才能在命令行中与您的程序进行交互。

最后java RandomSeq 10 | java Average 与java RandomSeq 10 相同,然后将输出输入java Average,第二个命令与java Average &lt; data.txt 相同,错误不是因为你的状态管道它,但只是因为 StdIn 没有作为已编译的 .class 文件存在。

【讨论】:

  • 编译 StdIn.java 和 StdOut.java 解决了这个问题。非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多