java classpath связанный запрос с оператором импорта - PullRequest
1 голос
/ 11 января 2011

Моя нижеприведенная программа называется Apple.java

import food.Fruit;
class Apple extends Fruit{
public static void main(String[] args){
    int y=20,z=0;
    z=y+10;
    System.out.println("x+y is "+z);
}
}

Это еще одна программа под названием Fruit.java

 package food;
 public abstract class Fruit{
    public static void main(String[] args){
    int x=10;
    System.out.println("x is "+x);
    }
 }

Обе эти программы хранятся в следующем каталоге: - G: \ Java \ food Я успешно скомпилировал обе программы, используя следующую команду: -

G:\>javac Java\food\*.java

, и он создал файлы классов.Мне удалось запустить программу Fruit с помощью следующей команды: -

G:\>java -classpath G:\Java food.Fruit

Однако, когда я попытался сделать то же самое для программы Apple, это привело к сообщениям об ошибках.

G:\>java -classpath G:\Java food.Apple
Exception in thread "main" java.lang.NoClassDefFoundError: food/Apple (wrong name: Apple)

Может кто-нибудь помочь мне разобраться в чем ошибка?Я пытаюсь подготовиться к экзамену по сертификации SCJP, и поэтому я ссылаюсь на этот пример в книге изданий McGrawHill, написанной Кэти Сьерра и Берт Бейтс.


Правка # 2

Да, я сделал, потому что так было в книге.Есть ли способ, которым я все еще мог бы выполнить файл, не включая оператор пакета.

Вот как выглядит вопрос:

Попытка скомпилировать два файла.Если вы хотите использовать класс Apple, убедитесь, что вы поместили файл Fruit.class в подкаталог food.

Edit # 3

Я попробовал это и получилследующие ошибки

G:\>java -classpath G:\Java\food Apple
Exception in thread "main" java.lang.NoClassDefFoundError: food/Fruit
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(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)
Caused by: java.lang.ClassNotFoundException: food.Fruit
    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)
    ... 12 more
Could not find the main class: Apple.  Program will exit.

Редактировать # 4

Мне удалось выполнить его без необходимости включать пакет операторов питания;

G:\>java -classpath G:\Java\food;G:\Java Apple
x+y is 30

Что яизменилось, когда я переместил файл Apple.class в отдельную папку, что имеет смысл, поскольку папка «food» указывает на пакет, а Дарвис указал все файлы в папке, которые должны иметь имя пакета, иначе он не будет выполняться.


Редактировать # 5 Это тоже сработало

G:\>java -classpath G:\Java Apple
x+y is 30

1 Ответ

2 голосов
/ 11 января 2011

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

package food;
import food.Fruit;
class Apple extends Fruit{
public static void main(String[] args){
    int y=20,z=0;
    z=y+10;
    System.out.println("x+y is "+z);
}
}

Обновление:

Когда вы выполните ниже

G:\>java -classpath G:\Java food.Apple
Exception in thread "main" java.lang.NoClassDefFoundError: food/Apple (wrong name: Apple)

, это добавит G:\Javaв пути к классам оттуда он будет относиться к поиску яблок класса в еде DIR с указанным именем пакета food

Или.если вы не хотите указывать пакет в классе, тогда

G:\>java -classpath G:\Java\food Apple
...