Подтвердить что ты не робот

Javac "не может найти символ"

У меня есть корневой каталог:

├── classes
└── src
    └── vehicles
        ├── Bicycle.java
        └── BicycleMain.java

Bicycle.java

package vehicles;

public class Bicycle {

  public int cadence;
  public int gear;
  public int speed;

  public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
  }

  public void setCadence(int newValue) {
      cadence = newValue;
  }
  public void setGear(int newValue) {
    gear = newValue;
  }
  public void setSpeed(int newValue) {
    speed = newValue;
  }
  public int getGear() {
    return gear;
  }
  public int getCadence() {
    return cadence;
  }
  public int getSpeed() {
    return speed;
  }
  public void applyBrake(int decrement) {
    speed -= decrement;
  }
  public void speedUp(int increment) {
    speed += increment;
  }

BicycleMain.java

package vehicles; import vehicles.*;

public class BicycleMain {
        public static void main (String args[]){
        Bicycle Bike = new Bicycle(10, 20, 1);
        System.out.println("We have a new bicycle with speed = " +Bike.getSpeed()+", cadence = "+Bike.getCadence()+", gear = "+Bike.getGear());
        } }

Я скомпилировал Bicycle.java и успешно, но не для BicycleMain.java:

symbol  : class Bicycle
location: class vehicles.BicycleMain
    Bicycle Bike = new Bicycle(10, 20, 1);
    ^
src/vehicles/BicycleMain.java:6: cannot find symbol
symbol  : class Bicycle
location: class vehicles.BicycleMain
    Bicycle Bike = new Bicycle(10, 20, 1);
                       ^
2 errors

Я пытаюсь запустить эти файлы с Netbeans и IT WORKS! но почему это не работает, когда я компилирую в CLI?

4b9b3361

Ответ 1

Во-первых, Чтобы скомпилировать исходный файл java с помощью javac, вам необходимо явно указать файлы для компиляции.

Пример:

javac PathToSourceFile/FileName.java

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

Во-вторых, всякий раз, когда java сталкивается с import abc.xyz.ClassName;, он пытается разрешить abc/xyz/ClassName по отношению к classpath или текущему рабочему каталогу.

Итак, если вы находитесь в папке с транспортными средствами и скомпилируете свой код, он не будет компилироваться, потому что он будет искать папки в автомобилях папок (которых не существует!).

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

javac -cp ../ BicycleMain.java

и он должен скомпилироваться, потому что путь к классам будет установлен в каталог (../), содержащий транспортные средства. который разрешит ваш класс Bicycle.

а затем используйте

java -cp ../ vehicles/BicycleMain для запуска.

Ответ 2

Попробуйте удалить строку import vehicles.*; из BicycleMain.java и их компиляцию с помощью javac в командной строке.

Кстати, это происходит потому, что во время компиляции в javac вы находитесь в папке vehicles, и вы пишете оператор import vehicles.*; в BicycleMain.java, что означает, что в компиляторе есть еще одна папка vehicles внутри vehicles, что здесь не так.

Ответ 3

Просто удалите линию пакета с начала, и она будет работать на 100%.

Перейдите в папку, в которой файлы хранятся через терминал и type javac *.java

Не нужно также импортировать классы.

Ответ 4

Я решил эту проблему, компилируя из "src".

Что-то вроде этого: javac ./my_folder/my_file.java

С уважением