2015-06-23 2 views
3

У меня есть класс RandomSeq, который печатает «args [0]» случайные двойники и класс Average, который печатает среднее значение StdIn. Я использую DrJava для написания кодов и компиляции. Я загрузил библиотеки StdIn и out и поместил их в одну и ту же папку моих классов. Я изучаю Java.Ошибка в программировании 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 показывает тот же error.Why?

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); 
    } 
} 
+0

Что такое полное имя 'StdIn'? Это на вашем пути к классу? –

+0

«Когда я пишу java RandomSeq 10> data.txt вместо создания текстового файла» - где вы пишете это? :) – matrixanomaly

+0

@AndyTurner Я новичок в java. Что вы подразумеваете под «полностью квалифицированным именем» StdIn? Я загрузил его здесь: http://introcs.cs.princeton.edu/java/15inout/StdIn.java –

ответ

1

Это related question on StdIn. StdIn не является стандартной библиотекой java, поскольку вы упомянули, что следуете курсу Princeton, что курс StdIn.java предоставляется курсом, вам, вероятно, необходимо скомпилировать StdIn.java с командой javac StdIn.java, чтобы сгенерировать файл StdIn.class, это решит Class not Found Exception. (Второй выпуск)

Что касается проблемы вы пишете java RandomSeq 10 > data.txt в DrJava (который я попросил разъяснений, потому что я не понимаю, DrJava это IDE, думал, что это была книга), потому, что раздел Interactions скорее всего, напрямую дает ввод вашей программе, то есть он передает все, что вы набираете там, как args[] для вашей функции main.

Выход печатается, потому что вы вызываете system.out.println в свой код, а DrJava просто извлекает этот вывод и выводит его на экран и не будет передавать ваш файл data.txt. Я бы порекомендовал это, так как вы используете материал курса, который требует, чтобы такие вещи, как трубопровод, взаимодействовали с вашей программой в командной строке.

Наконец java RandomSeq 10 | java Average таким же, как делает java RandomSeq 10, а затем принимает, что выход в java Average, что вторая команда является таким же, как вы делаете java Average < data.txt, ошибка не из-за того, как вы конвейер, но только из-за StdIn не присутствует как скомпилированный файл .class.

+1

Компиляция StdIn.java и StdOut.java решила проблему. Большое спасибо;) –

+0

@ Zeta.Investigator nice. Удачи вам в изучении Java! – matrixanomaly

2

StdIn не из встроенной библиотеки Java. Он является частью сторонней библиотеки, которая содержится в файле stdlib.jar, который может быть загружен с here.

Путь к этому файлу JAR должен быть в -CLASSPATH опции командной строки javac и java заклятий. Использование стандартных библиотек в разделе this page показывает, как это сделать; опция -cp является только сокращенной для -CLASSPATH. Важно научиться размещать библиотеки на вашем CLASSPATH, так как вы все время будете делать это с Java.

Ваш Average.java код также должен importStdIn класс. Поскольку StdIn не находится в именованном пакете, вы просто скажете import StdIn; в верхней части кода.

В качестве альтернативы, вы можете просто использовать System.in, а не эту библиотеку. Вероятно, вам также нужна конструкция потока более высокого уровня. Here's a nice example.

+0

Но в ссылке ниже в разделе «Подключение двух программ»: http://introcs.cs.princeton.edu/java/15inout/, ни одна из этих Предпосылки: - | –

+0

См. Последние изменения. –

+0

Спасибо sparc_spread;) –