Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多文件和文件夹层次结构_Java_Class_Object_Compiler Errors_Package - Fatal编程技术网

Java多文件和文件夹层次结构

Java多文件和文件夹层次结构,java,class,object,compiler-errors,package,Java,Class,Object,Compiler Errors,Package,我有多个Java文件,其中一个(Demo)是大多数函数所在的位置,DemoTest1是main所在的位置。 我尝试打包演示文件并在其他文件中使用该包,但是当我使用终端(javac…)编译时,DemoTest1没有编译,因为它还有一个函数,该函数包含一个参数,返回值是演示文件的一个对象 Demo.java文件: package xyz.mypackage; class Demo{ private double val1; private double val2;

我有多个Java文件,其中一个(Demo)是大多数函数所在的位置,DemoTest1是main所在的位置。 我尝试打包演示文件并在其他文件中使用该包,但是当我使用终端(javac…)编译时,DemoTest1没有编译,因为它还有一个函数,该函数包含一个参数,返回值是演示文件的一个对象

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);
    }
}
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());
    }
}
demost1.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);
    }
}
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)
如果我按照正确的说明操作,它应该会运行,但我想DemoTest1中并没有包含DemoDemo,我不理解这一点,因为我使用了打包。或者我是否需要编译不同于使用javac的文件。。然后用java运行DemoTest1

编辑:更改文件夹层次结构和修复语法错误使其成功编译,但在尝试运行它(java DemoTest1)时,我发现:

Exception in thread "main" java.lang.NoSuchMethodError: main  
Edit2:异常已修复。虽然main()已经足够了,但它需要main(字符串args[])。 现在它工作得很完美,正如它的初衷。我感谢您的帮助和学习机会

解决方案:适用于寻找类似问题的任何人。我在使用包时编写了xyz.mypackage,因此它必须位于这些文件夹/子文件夹中(我认为,它本身就是包的常规语法,不管文件夹如何),还必须添加默认构造函数,因为我添加了一个特殊构造函数,我错误地认为如果没有参数,它将只使用常规构造函数。
除了一些小的语法错误(没有正确使用println或使用%d而不是&f等)之外,另一个问题是main()不能为空,它需要有一个参数(字符串args[])。

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

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());
    }
}

演示类很好,但是这样试试应该可以。测试类中有一些语法错误。要调用double,可以使用
%.2f
表示小数点后两位的double,而不是原来的double。您也不需要将它们放入新的包或类似的东西中。

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

在Demost1中,您应该进行更改

import xyz.mypackage.Demo;

在演示中,您应该进行更改

class  Demo

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

差不多

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

是的,刚刚修好了。到达那里。出现语法错误,文件夹层次结构错误。现在它可以编译了,但当试图运行它时,我得到了一个新的错误..谢谢,我想&d对于一个小数来说已经足够了。我也不知道它需要包含main的参数。它现在工作得很漂亮,在研究的过程中我又学到了。
public class Demo
public Demo() {
    val1 = 0.0
    val2 = 0.0
}