【问题标题】:Why does this Java code using multiple constructors run in VS code but won't compile with javac?为什么这个使用多个构造函数的 Java 代码在 VS 代码中运行但不能用 javac 编译?
【发布时间】:2020-11-08 22:09:10
【问题描述】:

我一直在尝试在 Java 中使用多个构造函数。以下是我的代码:

public class MultipleConstructors {
    int x = 20;
    int y = 50;
    String color = "Green";
    String color2 = "Yellow";

    public MultipleConstructors() {

    }

    public MultipleConstructors(int numb, int numb2, String colOne, String colTwo) {
        x = numb;
        y = numb2;
        color = colOne;
        color2 = colTwo;
    }

    public MultipleConstructors(int numb3, int numb4, String colThree, String colFour) {
        x = numb3;
        y = numb4; 
        color = colThree;
        color2 = colFour;
    }

    public MultipleConstructors(int numb5, int numb6, String colFive, String colSix) {
        x = numb5;
        y = numb6; 
        color = colFive;
        color2 = colSix;
    }

    public static void main(String[] args) {
        MultipleConstructors myObjOne = new MultipleConstructors(100, 200, "Pink", "Blue");
        MultipleConstructors myObjTwo = new MultipleConstructors(300, 500, "Burgandy", "Silver");
        MultipleConstructors myObjThree = new MultipleConstructors(800, 1000, "Black", "White");
        MultipleConstructors myObjFour = new MultipleConstructors();

        System.out.println(myObjOne.x + myObjOne.y + " " + myObjOne.color + " " + myObjTwo.color2 + " " + " : SUCCESS");

        System.out.println(myObjTwo.x + myObjTwo.y + " " + myObjTwo.color + " " + myObjTwo.color2 + " " + " : VICTORY");

        System.out.println(myObjThree.x + myObjThree.y + " " + myObjThree.color + " " + myObjThree.color2 + " " + " : YES");

        System.out.println(myObjFour.x + myObjFour.y + " " + myObjFour.color + " " + myObjFour.color2 + " " + " : YES");
    }
}

它在 VS Code 中运行,但不会使用 javac 命令编译。我认为可能是父属性声明后未定义的构造函数public MultipleConstructors() {}

【问题讨论】:

  • 在您的终端中运行以下命令(javac --version),如果您没有得到版本号输出,则可能是您的机器中没有设置 javac 路径变量
  • 输入 javac --version: javac 15.0.1
  • 好的,所以当您尝试在 VSCode 中运行代码时,它可以正常工作,而在终端中既不工作也不抛出错误?
  • 正确,在 VSCode 中运行但不会编译以便在终端中运行。它抛出由“ClassNotFoundException”引起的错误“找不到或加载主类”
  • 我怀疑这是否可以在 VSCode 中编译或以其他方式编译。您有几个具有完全相同参数类型的构造函数,因此编译器在调用它们时无法确定您的意思。

标签: java visual-studio-code constructor javac


【解决方案1】:

如果您收到类似以下错误消息:

MultipleConstructors.java:11: error: constructor MultipleConstructors(int,int,java.lang.String,java.lang.String) is already defined in class MultipleConstructors

那么你应该使用这个答案。如果您遇到 ClassNotFoundException,您应该看到 Ntshembo Hlongwane 的回答。

您的问题是您有多个相同的构造函数。我认为您要做的是构造函数重载,这意味着您可以拥有多个具有不同标头的构造函数,但是您的三个构造函数具有相同的标头。在下面的构造函数中查看我的 cmets:

public MultipleConstructors() {
    // header has no parameters
    // fine, leaves values alone
}

public MultipleConstructors(int numb, int numb2, String colOne, String colTwo) {
    // header has parameters int, int String String
    //fine, offers you the opportunity to change those values

    x = numb;
    y = numb2;
    color = colOne;
    color2 = colTwo;
}

public MultipleConstructors(int numb3, int numb4, String colThree, String colFour) {
    // header has parameters int, int, String, String
    // Wait, that's the same as the one above!

    x = numb3;
    y = numb4; 
    color = colThree;
    color2 = colFour;
}

public MultipleConstructors(int numb5, int numb6, String colFive, String colSix) {
    // header has parameters int, int, String, String
    // Wait, that's also the same as the one above!

    x = numb5;
    y = numb6; 
    color = colFive;
    color2 = colSix;
}

当你实例化这个对象并给它两个整数和一个字符串时,你希望调用哪个构造函数?这是一个逻辑错误,而不是语法错误或编译器错误,因为您的代码不明确。希望这对您有所帮助,并祝您在学习之旅中好运。 :)

【讨论】:

  • 对不起,我能问一下重载构造函数/方法的错误方式与给出的这个异常有什么关系,即"could not find or load main class " caused by "ClassNotFoundException"
  • 该信息是在我写完这个答案后发布的。如果您想修复该错误,您将使用您的答案。也就是说,一旦你修复了 ClassNotFoundException,你很快就会在构造函数上遇到编译时错误。我猜 OP 需要我们两个答案。为你 +1。
  • 由于构造函数/方法重载中的错误方法而引发的异常/错误将是:例如Stack.java:14: error: constructor Stack(int) is already defined in class Stack
  • 好的,谢谢,我会将其纳入我的回答中。
  • 它是在我按照 Charlie Armstrong 的建议更改数据类型后编译的。
【解决方案2】:

基于运行代码时发现的异常

Correct, runs in VSCode but won't compile in order to run in terminal. It throws the error "could not find or load main class " caused by "ClassNotFoundException"

这是由以下原因引起的:

  • 假设您将文件命名为Test.java
  • 然后在您的代码中将类编写为MyTest
  • 当您尝试运行代码 java Test 时,您会收到以下错误:
Error: Could not find or load main class Test
Caused by: java.lang.ClassNotFoundException: Test
  • 这是因为 Java 现在创建了一个 MyTest.class,您必须改为运行它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多