我遇到一些程序没有找到所需类的问题,尽管它们具有相同的目录和相同的包声明。
Eclipse说“无法找到或运行主类”,所以我尝试手动编译它。以下是编译器所说的内容:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.
C:\Users\Gilbert>cd C:\Users\Gilbert\Desktop\factory
C:\Users\Gilbert\Desktop\factory>"C:\Program Files\Java\jdk1.7.0_45\bin\javac" P
rodukt.java
C:\Users\Gilbert\Desktop\factory>"C:\Program Files\Java\jdk1.7.0_45\bin\javac" S
tation.java
C:\Users\Gilbert\Desktop\factory>"C:\Program Files\Java\jdk1.7.0_45\bin\javac" L
ine.java
Line.java:8: error: cannot find symbol
private Produkt produkt;
^
symbol: class Produkt
location: class Line
Line.java:9: error: cannot find symbol
private ArrayList<Station> stations;
^
symbol: class Station
location: class Line
Line.java:12: error: cannot find symbol
public Line(String name, Produkt produkt){
^
symbol: class Produkt
location: class Line
Line.java:17: error: cannot find symbol
public void add(Station station){
^
symbol: class Station
location: class Line
Line.java:25: error: cannot find symbol
public Station getStation(int number){
^
symbol: class Station
location: class Line
5 errors
这是代码(“试图编译”类,不包括主类):
文件1:
package factory;
public class Produkt{
private String name;
public Produkt(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
文件2:
package factory;
public class Station{
private int number;
private int time;
public Station(int number, int time){
this.number = number;
this.time = time;
}
public int getNumber(){
return this.number;
}
public void setNumber(int number){
this.number = number;
}
public int getTime(){
return this.time;
}
public void setTime(int time){
this.time = time;
}
}
文件3:
package factory;
import java.util.ArrayList;
public class Line{
private String name;
private Produkt produkt;
private ArrayList<Station> stations;
private int time;
public Line(String name, Produkt produkt){
this.name = name;
this.produkt = produkt;
}
public void add(Station station){
stations.add(station.getNumber(), station);
}
public String getName(){
return this.name;
}
public Station getStation(int number){
return stations.get(number);
}
public String getProduktName(){
return produkt.getName();
}
public int getTime(){
for (int i = 0; i < stations.size(); i++){
this.time = this.time + stations.get(i).getTime();
}
return this.time;
}
public int getStations(){
return stations.size();
}
}
完整程序的下载链接:https://dl.dropboxusercontent.com/u/34761768/factory%20-%20stack%20overflow.zip
编辑:
好的,这是主要课程:
包装厂;
public class Main {
public static void main(String[] args){
Factory factory = new Factory("");
factory.reader(args[0]);
factory.print();
System.out.println("----");
factory.printBestWayOf2();
System.out.println("----");
factory.printBestWay();
}
}
它使用了另一个我没有展示的课程,因为它是最长的课程。 我没有显示主类,因为错误发生我尝试编译主类或另一个。我只能编译那些没有任何引用其他类作为包的一部分的类,例如produkt和station,但是任何其他类都找不到它们,尽管它们都是包的所有部分,并且都在directoy中。
答案 0 :(得分:2)
您需要一个使用main
方法的课程。
您正在获取所有这些错误,因为这些类是相互依赖的。您需要使用javac *.java
执行2后的事件,您的程序将无法运行,因为1。
如果你不知道,这是一个main
方法
public static void main(String[] args) {
}
创建另一个类来运行该应用程序。像这样的东西
public class App {
public static void main(String[] args) {
Produkt p = new Produkt("product");
Line line = new Line("line", p);
line.add(new Station(1, 2));
....
}
}
其他说明。
不确定你想要这个
public void add(Station station){
stations.add(station.getNumber(), station);
}
您正在使用的add
方法,第一个参数是ArrayList
的索引。那将导致你的问题,索引可能不会存在
add(int index, E element)
Inserts the specified element at the specified position in this list.
只做
stations.add(station);
您应该在构造函数中初始化stations
。如果你不这样做,你将面临NullPointerException
public Line(String name, Produkt produkt){
this.name = name;
this.produkt = produkt;
station = new ArrayList<Station>();
}
如果您想稍后打印一个对象,可能需要覆盖课程中的toString
。
更新
不要不将字符串与==
进行比较。使用equals
if (parts[0] == "factory")
更改为
if ("factory".equals(parts[0]))
更改所有。
编译代码时遇到问题。
您可能还需要设置启动配置。您需要右键单击项目,然后转到属性。单击运行/调试设置。如果您的Main
类不在该列表中,则单击New,然后单击Java Application,然后找到您的类,确保它是Main Class。确保使用完全限定的名称,例如mypackage.Main
答案 1 :(得分:1)
您是否有理由不在主要课程中加入此问题?
应用程序需要
public static void main(Strings args[]){
}
编译 但是让我们谈谈你试图从命令行运行。 cd - 更改目录 C:\ Users \ Gilbert \ Desktop \ factory&gt;“C:\ Program Files \ Java \ jdk1.7.0_45 \ bin \ javac”P rodukt.java
好的,你把目录改为C:\ Users \ Gilbert \ Desktop \ factory 然后由于某种原因在引号中列出“C:\ Program Files \ Java \ jdk1.7.0_45 \ bin \ javac”,为什么? 第1阶段:将目录更改为类文件的实际位置,此类文件应该是包含以下内容的类:
public static void main(String args[]){
}
所以换句话说,应该做以下几点 cd C:\ Users \ Gilbert \ Desktop \ factory \包含主类的实际文件夹
javac Main.java(这会编译Main类)
答案 2 :(得分:-1)
好的,所以我解决了,但我的解决方案仍有问题:
如果我从包中取出主类,并导入它(import factory。*;) 我可以编译并运行它,但我的任务禁止我使用默认包。 我自己的包装之外的主要课程是否违反了这条规则?
谢谢答案!