【发布时间】:2018-09-15 20:05:04
【问题描述】:
我有多个 Java 文件,其中一个 (Demo) 是大多数函数所在的地方,而 DemoTest1 是主要所在的地方。 我尝试打包 Demo 文件并在其他文件中使用该包,但是当我使用终端 (javac ...) 编译时,DemoTest1 无法编译,因为它还有一个带有参数的函数,并且返回值是Demo 文件的对象。
Demo.java 文件:
package xyz.mypackage;
class Demo{
private double val1;
private double val2;
private void setValues(double num1, double num2){
val1 = num1;
val2 = num2;
}
private double getValue1(){
return (this.val1);
}
private double getValue2(){
return (this.val2);
}
private double getAverage(){
return((this.val1 + this.val2) / 2);
}
public Demo(double double1, double double2){
this.val1 = double1;
this.val2 = double2;
}
static void decrDemo(Demo obj){
obj.setValues(obj.val1 - 1, obj.val2 - 1);
}
}
DemoTest1.java 文件:
import java.util.Scanner;
import xyz.mypackage.Demo;
public class DemoTest1{
static Demo addDemo(Demo obj1, Demo obj2){
return new Demo(obj1.getValue1() + obj2.getValue1(), obj1.getValue2() + obj2.getValue2());
}
static void incrDemo(Demo obj){
obj.setValues(obj.getValue1() + 5, obj.getValue2() + 5);
}
public static void main(){
Demo item = Demo();
System.out.printl("\nPlease enter 2 numbers: ");
Scanner input = new Scanner(System.in);
double val1 = input.nextDouble();
double val2 = input.nextDouble();
demo.setValues(val1, val2);
System.out.printl("\nThe average of the two values entered is: " + item.getAverage());
Demo obj1 = new Demo(5, 7),
obj2 = new Demo(14, 9);
Demo objR = addDemo(obj1, obj2);
incrDemo(obj1);
System.out.printl("\nobjR has the following values. val1: &d\tval2: &d", objR.getValue1(), objR.getValue2());
System.out.printl("\nobj1 has the following values. val1: &d\tval2: &d", obj1.getValue1(), obj1.getValue2());
}
}
错误输出:
Air:Project xyz$ javac Demo.java DemoTest1.java
DemoTest1.java:2: xyz.mypackage.Demo is not public in xyz.mypackage;
cannot be accessed from outside package
import xyz.mypackage.Demo;
^
./Demo.java:3: duplicate class: xyz.mypackage.Demo
class Demo
^
DemoTest1.java:6: cannot access Demo
bad class file: ./Demo.java
file does not contain class Demo
Please remove or make sure it appears in the correct subdirectory of
the classpath.
static Demo addDemo(Demo obj1, Demo obj2)
如果我按照正确的说明进行操作,它应该会运行,但我想,Demo 没有包含在 DemoTest1 中,我不明白,因为我使用了包装。或者我是否需要以不同的方式编译文件而不是在每个文件上使用 javac .. 然后使用 java .. 运行 DemoTest1 ?
编辑:更改文件夹层次结构并修复语法错误使其成功编译,但在尝试运行它时(java DemoTest1)我得到这个:
Exception in thread "main" java.lang.NoSuchMethodError: main
Edit2: 异常已修复。认为 main() 就足够了,但它需要 main(String args[])。 现在它完美地工作了,就像它的预期一样。感谢您的帮助和学习机会!
解决方案:适用于寻找类似问题的任何人。我在使用包时编写了 xyz.mypackage,因此它必须位于那些文件夹/子文件夹中(我认为,它本身就是打包的常规语法,与文件夹无关),还必须添加一个默认构造函数,因为我添加了一个特殊的构造函数,我错误地认为如果没有参数,它只会使用常规的。 除了一些小的语法错误(没有正确使用 println 或使用 %d 代替 &f 等)之外的另一个问题是 main() 不能留空,它需要有一个参数(String args[])。
【问题讨论】:
标签: java class object compiler-errors package