Java не будет запускать программу в терминале java.lang.NoClassDefFoundError - PullRequest
1 голос
/ 25 января 2012

Я следую Java-учебникам на сайте Принстона .

Я работаю debian sqeeze 64bit и установил Sun java версии 6.

Я могу без проблем скомпилировать и запустить базовую программу hello world, используя терминал и Eclipse IDE.

Проблема:

когда я пытаюсь скомпилировать и запустить программу, которая требует ввода аргумента, например:

public class RandomSeq { 
    public static void main(String[] args) {

        // command-line argument
        int N = Integer.parseInt(args[0]);

        // generate and print N numbers between 0 and 1
        for (int i = 0; i < N; i++) {
            System.out.println(Math.random());
        }
    }
}

Я могу запустить это на Eclipse с целочисленным аргументом, однако он не работает на терминале.

Я получаю эту ошибку:

emes @ debian: ~ / Documents / workspace / IOput / src / randomSeq $ java RandomSeq 21 Исключение в потоке "main" java.lang.NoClassDefFoundError: RandomSeq (неправильное имя: randomSeq / RandomSeq) в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClassCond (ClassLoader.java:631) в java.lang.ClassLoader.defineClass (ClassLoader.java:615) в java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141) в java.net.URLClassLoader.defineClass (URLClassLoader.java:283) на java.net.URLClassLoader.access $ 000 (URLClassLoader.java:58) на java.net.URLClassLoader $ 1.run (URLClassLoader.java:197) at java.security.AccessController.doPrivileged (собственный метод) в java.net.URLClassLoader.findClass (URLClassLoader.java:190) в java.lang.ClassLoader.loadClass (ClassLoader.java:306) at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301) в java.lang.ClassLoader.loadClass (ClassLoader.java:247) Не удалось найти основной класс: RandomSeq. Программа закроется.

Я пытался обновить /etc/profile, чтобы включить java-6-sun в переменную PATH.

Я не уверен, что попробовать отсюда.

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Очевидно, вы пытаетесь запустить программу из папки src проекта Eclipse.src означает «источник».Исполняемая версия вашей программы (скомпилированные классы) находится не в src;он находится в bin, что означает «двоичный», то есть машинный код.

При использовании командной строки вы должны сначала скомпилировать вашу программу:

javac MyClass.java

, а затем запустить ее:

java MyClass

Но, пожалуйста, не делайте этого внутри структуры каталогов проекта Eclipse, иначе вы создадите дополнительные файлы (файлы классов), которые Eclipse не ожидает в этом месте.


Кроме того, возможно, вы находитесь в пакете.Вы не можете запустить класс, если вы находитесь в его папке пакета.Вы должны находиться на верхнем уровне иерархии пакетов.

Пример: предположим, что ваш класс находится внутри пакета с именем mypackage.Тогда в someFolder/mypackage/MyClass.java у вас будет что-то вроде:

package mypackage;

class MyClass {
    ...
}

После компиляции кода вы должны быть в somefolder и выполнить команду оболочки:

java mypackage.MyClass
1 голос
/ 25 января 2012

Похоже, что у вашего класса есть пакет

package randomSeq;

public class RandomSeq {

Если это так, то при запуске он должен находиться в папке randomSeq , а корень этой папки должен бытьв вашем пути к классу, и пакет должен быть указан при вызове.

Итак, если ваш файл .class находится в bin / randomSeq, вы можете запустить его с java -cp bin randomSeq.RandomSeq 21

0 голосов
/ 25 января 2012

Не беспокойтесь об аргументе, так как это приведет к исключению нулевого указателя во время выполнения.Проблема в вашем classpath.

Создайте список (ls или dir) в каталоге, из которого вы запускаете java RandomSeq.У вас есть .class file там.Если нет, сначала запустите javac RandomSeq.java, чтобы сгенерировать файл класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...