Arhn - архитектура программирования

Java-программа не распознает подчиненные классы. Ввод пакета не существует.

Я пытаюсь понять этот демонстрационный пример. Дается только класс HelloWorld, поэтому я должен сам реализовать класс Input и Output.

я понимаю сообщение об ошибке: java не может найти файлы Input.java и Output.java при их импорте. поэтому файл HelloWorld.class построен неправильно. Но я не понимаю, почему это происходит. Я думаю, я сделал небольшую ошибку в структуре каталогов файловой системы или импорта, но я не могу ее обнаружить. Где моя ошибка?

Я также прочитал 2 и 3, но это тоже не работает.


HelloWorld.java

package org.fedoraproject.helloworld;

import org.fedoraproject.helloworld.input.Input;
import org.fedoraproject.helloworld.output.Output;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.print("What is your name?: ");
        String reply = Input.getInput();
        Output.output(reply);
    }
}

Input.java

package org.fedoraproject.helloworld;

import java.util.Scanner;

public class Input {

    public static String getInput() {
        Scanner scanner = new Scanner(System.in);
        String returnVal = scanner.next();
        scanner.close();

        return returnVal;
    }

}

Output.java

package org.fedoraproject.helloworld;

public class Output {

    public static void output(String s) {
        System.out.println(s);

    }
}

$ find
.
./src
./src/org
./src/org/fedoraproject
./src/org/fedoraproject/helloworld
./src/org/fedoraproject/helloworld/output
./src/org/fedoraproject/helloworld/output/Output.class
./src/org/fedoraproject/helloworld/output/Output.java
./src/org/fedoraproject/helloworld/input
./src/org/fedoraproject/helloworld/input/Input.class
./src/org/fedoraproject/helloworld/input/Input.java
./src/org/fedoraproject/helloworld/HelloWorld.class
./src/org/fedoraproject/helloworld/HelloWorld.java

$ java -cp src/org/fedoraproject/helloworld/input/Input.class:src/org/fedoraproject/helloworld/output/Output.class src/org/fedoraproject/helloworld/HelloWorld.class
Error: Could not find or load main class src.org.fedoraproject.helloworld.HelloWorld.class

$ javac -cp src/ src/org/fedoraproject/helloworld/HelloWorld.java
src/org/fedoraproject/helloworld/HelloWorld.java:3: error: cannot access Input
import org.fedoraproject.helloworld.input.Input;
                                         ^
  bad source file: src/org/fedoraproject/helloworld/input/Input.java
    file does not contain class org.fedoraproject.helloworld.input.Input
    Please remove or make sure it appears in the correct subdirectory of the sourcepath.

Обновление:

После изменения объявлений пакетов Input.java и Output.java на:

package org.fedoraproject.helloworld.input;
package org.fedoraproject.helloworld.output;

который производит (применяя предложения в ответах):

$ javac -cp src org/fedoraproject/helloworld/HelloWorld.java
org/fedoraproject/helloworld/HelloWorld.java:3: error: package org.fedoraproject.helloworld.input does not exist
import org.fedoraproject.helloworld.input.Input;
                                         ^
org/fedoraproject/helloworld/HelloWorld.java:4: error: package org.fedoraproject.helloworld.output does not exist
import org.fedoraproject.helloworld.output.Output;
                                          ^
org/fedoraproject/helloworld/HelloWorld.java:9: error: cannot find symbol
        String reply = Input.getInput();
                       ^
  symbol:   variable Input
  location: class HelloWorld
org/fedoraproject/helloworld/HelloWorld.java:10: error: cannot find symbol
        Output.output(reply);
        ^
  symbol:   variable Output
  location: class HelloWorld
4 errors

Последнее обновление Теперь это работает, после выполнения этих команд в родительской папке `src':

$ find -type f
./src/org/fedoraproject/helloworld/output/Output.java
./src/org/fedoraproject/helloworld/output/Output.class
./src/org/fedoraproject/helloworld/input/Input.class
./src/org/fedoraproject/helloworld/input/Input.java
./src/org/fedoraproject/helloworld/HelloWorld.java
./src/org/fedoraproject/helloworld/HelloWorld.class
~/java-example-project 
$ javac -cp src/ src/org/fedoraproject/helloworld/HelloWorld.java
~/java-example-project 
$ java -cp src org.fedoraproject.helloworld.HelloWorld
What is your name?: toogley
toogley
26.06.2016

  • Ну да, вы не объявили пакет с именем org.fedoraproject.helloworld.input. Посмотрите на свои операторы пакета: package org.fedoraproject.helloworld. Вы также должны сделать так, чтобы ваши исходные местоположения соответствовали вашим объявлениям пакетов, чего они не соответствуют в данный момент. 26.06.2016
  • Имейте в виду, сообщение об ошибке, которое вы показываете, предполагает, что ваш код в любом случае не соответствует описанию: import input.Input - это не то же самое, что import org.fedoraproject.helloworld.input.Input. 26.06.2016
  • @JonSkeet спасибо за обе подсказки. 26.06.2016
  • Я воспроизвел ваш проект, как вы его описали, но я не получаю ошибку. Вы также перекомпилировали Input и Output после изменения объявления пакета? 26.06.2016

Ответы:


1

1.) Измените объявление пакета класса Input/Ouput:

package org.fedoraproject.helloworld.input;
package org.fedoraproject.helloworld.output;

Так как они находятся в папках input/output.

2.) Путь к классам должен быть установлен в корень всех пакетов, а переданный основной класс должен использовать полное имя:

$ java -cp src org.fedoraproject.helloworld.HelloWorld
26.06.2016
  • ну, после javac -cp src/ src/org/fedoraproject/helloworld/HelloWorld.java и java -cp src src/org/fedoraproject/helloworld/HelloWorl я получаю это: Error: Could not find or load main class src.org.fedoraproject.helloworld.HelloWorld 26.06.2016
  • @toogley Не могли бы вы попробовать использовать ./src в качестве пути к классам или, может быть, src/? Я обычно делаю это на окнах. Но будьте уверены, для пути к классам следует установить значение по умолчанию. пакет, то есть корень. 26.06.2016
  • @toogley О, только что заметили, src/ не должно стоять перед путем к основному классу. Извини. 26.06.2016
  • ой, извини. Я этого не заметил. 26.06.2016
  • Ваш вызов java неверен - он должен быть java -cp src org.fedoraproject.helloworld.HelloWorld. Вы указываете имя класса, а не его расположение в файловой системе. 26.06.2016
  • @JornVernee Я ответил на это в своем обновленном вопросе. 26.06.2016
  • @JonSkeet Да, но использование / вместо . тоже работает. (Я просто использовал слово «путь», потому что оно похоже на него) 26.06.2016
  • @JornVernee: Сейчас работает, но раньше не было - и я не знаю, работает ли это повсеместно. Определенно лучше указать имя класса, IMO. Я бы определенно использовал имя класса в его обычной форме в ответах. 26.06.2016
  • @JonSkeet Я обычно использую ., но я думал, что / был стандартным/оригинальным способом. Хорошо знать :) 26.06.2016

  • 2

    заголовок пакета для ввода и вывода неверен

    ты делаешь

    импортировать org.fedoraproject.helloworld.input.Input; импортировать org.fedoraproject.helloworld.output.Output;

    но класс ввода находится в

    package org.fedoraproject.helloworld;
    
    import java.util.Scanner;
    
    public class Input {
    

    и вывод

    package org.fedoraproject.helloworld;
    
    public class Output {
    
    26.06.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..