所以我在我的主类中有这个构造函数:
public class GCTest extends Program {
GCTest(int x, int y) {
int gcd = gcd(Math.abs(x), Math.abs(y));
int num = x / gcd;
int den = Math.abs(y) / gcd;
if (y < 0) num = -num;
}
}
当我在我的void run()中调用构造函数时,当我编译它时,cmd给了我以下错误“无法确定主类”但是当我创建一个只有构造函数的新java文件时我编译他们使用。;命令程序运行正常。我究竟做错了什么?我在编程方面有点新意。提前谢谢!
import java.lang.Runtime;
import acm.program.*;
public class GCTest extends Program {
GCTest(int x, int y){
int gcd = gcd(Math.abs(x), Math.abs(y));
int num = x / gcd;
int den = Math.abs(y) / gcd;
if (y < 0) num = -num;
}
public int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b,a%b);
}
public void run() {
Runtime myRuntime = Runtime.getRuntime();
println("Allocating 10000 Rational objects.");
for(int i = 0; i < 10000; i++){
new GCTest(i + 1, i + 2);
}
long fB = myRuntime.freeMemory();
println("Free memory before garbage collection = " + fB);
myRuntime.gc();
long fA = myRuntime.freeMemory();
println("Free memory after garbage collection = " + fA);
println("Garbage collection freed up " + (fA - fB) + " bytes.");
}
}
当我编译并运行已发布的程序时,我得到“无法确定主类错误”。 当我用这个Rational.java编译我的GCTest.java时(在我从GCTest代码中删除构造函数并用新的Rational(,)替换新的GCTest之后,一切运行正常。这是Rational.java:
public class Rational{
public Rational(int x, int y) {
int gcd = gcd(Math.abs(x), Math.abs(y));
int num = x / gcd;
int den = Math.abs(y) / gcd;
if (y < 0) num = -num;
}
public int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b,a%b);
}
}
答案 0 :(得分:2)
当您忘记包含主要方法时,通常会看到此错误:
public static void main(String[] args)
在你的程序中,你做了。尝试这样的事情:
public class GCTest extends Program {
..
..
public static void main(String[] args) {
new GCTest(...).run();
}
}
main(..)
是一种特殊方法,可以告诉Java程序的开始位置。
答案 1 :(得分:1)
我假设您的Program类是一个实现以下行的抽象类:
public static void main(String [] args) {
...
}
这是您的申请的入口点。如果不发布此代码,我猜它会强制您的扩展类实现run
方法。因此主入口点会调用run
来启动程序。像这样的东西
public abstract class Program {
public static void main(String[] args) {
this.run();
}
public abstract void run();
}
您正在使用以下命令进行编译:
javac -cp acm.jar GCTest.java
所以你告诉编译器将acm.jar添加到你的类路径中,并且只编译GCTest.java
我不确定您发布的实际错误是什么,但现在导航到您的源文件夹并运行
javac -cp acm.jar *.java
并查看是否有帮助
答案 2 :(得分:1)
以下是澄清:
user3083578发布的程序正在使用acm.program包。如果您的类扩展了Program类,则不需要编写自己的主类。您只需要在主类中实现run()方法。
该软件包的文档可在此处找到: http://www-cs-faculty.stanford.edu/~eroberts/jtf/rationale/ProgramPackage.html
您使用javac -cp acm.jar GCTest.java
编译程序。
编译完成后,如果需要运行程序,只需使用
即可java GCTest
更新
运行程序的正确方法是
java -cp .:acm.jar GCTest
如果我拿走你声明的构造函数(和所有依赖的行),我可以运行程序。我不知道acm.package是否支持声明你自己的构造函数。另外,我无法让.;
工作,我认为你的意思是.:
。
答案 3 :(得分:0)
要编译java程序,您只需要传递程序没有错误 但是,要运行java程序,必须设置一个入口点来显示程序应该运行的机器 我希望你现在明白你现在发生了什么 你必须有一个
public static void main(String[] args)
或
public static void main(String... args)
在您的某个类中为您的程序设置该入口点的方法。