【问题标题】:Java multiple files and folder hierarchyJava多文件和文件夹层次结构
【发布时间】: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


    【解决方案1】:

    您需要将 Demo 类声明为 公开。如果您可以检查错误,它确实明确提到了相同的内容。

    【讨论】:

      【解决方案2】:
      import java.util.Scanner; 
      
      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(String args[]) {
              Demo item = new Demo(0, 0);
      
              System.out.println("\nPlease enter 2 numbers: ");
              Scanner input = new Scanner(System.in);
              double val1 = input.nextDouble();
              double val2 = input.nextDouble();
              item.setValues(val1, val2);
      
              System.out.println("\nThe average of the two values entered is: " 
                      + item.getAverage());
      
              Demo obj1 = new Demo(5, 7);
              Demo obj2 = new Demo(14, 9);
      
              Demo objR = addDemo(obj1, obj2);
      
              incrDemo(obj1);
      
              System.out.printf("\nobjR has the following values. val1: %.2f\tval2: %.2f", 
                      objR.getValue1(), objR.getValue2());
              System.out.printf("\nobj1 has the following values. val1: %.2f\tval2: %.2f", 
                      obj1.getValue1(), obj1.getValue2());
          }
      }
      

      演示类很好,但尝试这种方式应该可以工作。测试类中有一些语法错误。要调用双精度,您可以使用 %.2f 来表示具有 2 个小数位的双精度,而不是您所拥有的。此外,您无需将它们放入新包装或类似的东西中。

      【讨论】:

      • 谢谢,虽然 &d 对于小数点来说已经足够了。我也不知道是否需要包含 main 的参数。它现在很漂亮,在研究中我又学到了。
      【解决方案3】:

      我认为这里可能存在一些问题:

      在 DemoTest1 你应该改变

      import xyz.mypackage.Demo;
      

      到

      import xyz.mypackage.Demo.*;
      

      和

      demo.setValues(val1, val2);
      

      到

       item.setValues(val1, val2);
      

      在演示中你应该改变

      class  Demo
      

      到

      public class Demo
      

      并添加一个默认构造函数,因为您在 DemoTest1 文件中引用了一个构造函数

      类似

      public Demo() {
          val1 = 0.0
          val2 = 0.0
      }
      

      【讨论】:

      • 是的,刚刚修复了这些。到达那里。存在语法错误并且文件夹层次结构错误。现在它可以编译了,但是当我尝试运行它时,我得到了一个新的错误..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多