24

我有这样的根目录:

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

自行车.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 运行这些文件,并且它可以正常工作!但是为什么当我在 CLI 中编译时它不起作用?

4

5 回答 5

33

首先,要使用编译 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跑步。

于 2012-11-24T10:12:22.220 回答
9

import vehicles.*;尝试从中删除该行,BicycleMain.java然后在命令行中使用 javac 进行编译。

顺便说一句,这是因为当您在 javac 中编译时,您在文件夹中vehicles并且您编写了一条语句import vehicles.*;,这意味着编译器在该文件夹中BicycleMain.java还有另一个文件夹,这里不是这种情况vehiclesvehicles

于 2012-11-24T02:33:40.783 回答
2

我已经解决了这个问题,从“src”编译。

像这样的东西:javac ./my_folder/my_file.java

亲切的问候

于 2017-09-07T06:34:45.663 回答
0

我在这里尝试了所有解决方案,但最终我发现问题在于我使用了不同版本的 JDK 和 JRE。

检查 JRE 版本:

java -version

检查JDK版本:

javac -version
于 2020-02-25T19:02:55.733 回答
-1

只需从一开始就删除包装线,它就会 100% 工作。

通过终端转到存储文件的文件夹并键入javac *.java

也不需要导入类。

于 2016-06-30T17:45:56.460 回答