java.lang.NoSuchMethodError 在 VSCode Linux 上创建具有构造函数的子实例 class 时发生异常

java.lang.NoSuchMethodError exception when creating an instance of child class having a constructor on VSCode Linux

这里我有一个constructor in super class 和相应的constructor in child class.

据我所知,在 child constructor 这种情况下,我需要使用 super 关键字。

我的程序是这样写的-

public class inheritance_demo6 {
    public static void main(String[] args) {
        Dog dog = new Dog("Rohu");
        System.out.println("My name is: " + dog.getName());
        dog.eat();
    }
}

class Animal {
    protected String name;    
    
    Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println("I am eating...");
    }

    public String getName() {
        return name;
    }

}

class Dog extends Animal {

    Dog(String name) {
        super(name);
    }
}

但是在执行时出现编译时错误 -

Exception in thread "main" java.lang.NoSuchMethodError: 'void Dog.<init>(java.lang.String)'
        at inheritance_demo6.main(inheritance_demo6.java:3)

它说错误在 line:3。在 line:3 中,我正在创建 class Dog 的实例。因此,如果我理解正确,错误是由于在编写 child class constructor.

时出现了一些不正确的代码

但我无法确定错误可能出在哪里。

我在 Ubuntu 上使用 Visual Studio 代码编辑器。

更新:

如果我 运行 独立地在终端上编写代码,它 运行 是完美的。它仅在 VSCode

上给出错误

这是我在 VSCode -

上的截图

我的Java版本-

$ java --version
openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.21.10)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.21.10, mixed mode, sharing)

这里我尝试运行在VSCode中安装一个简单的程序“Hello World”来检查VSCode安装或某些设置是否有任何错误。但它 运行 非常完美。这是屏幕截图 -

更新:

我将三个 classes 移动到三个不同的文件 -

InheritanceDemo6.java-

public class InheritanceDemo6 {
    public static void main(String[] args) {
        Dog dog = new Dog("Rohu");
        System.out.println("My name is: " + dog.getName());
        dog.eat();
    }
}

Animal.java -

public class Animal {
    protected String name;    
    
    Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println("I am eating...");
    }

    public String getName() {
        return name;
    }
}

Dog.java -

public class Dog extends Animal {
    Dog(String name) {
        super(name);
    }
}

在这里,得到一些奇怪的错误-

在classDog.java中得到错误-

Animal cannot be resolved to a typeJava(16777218)

在classInheritanceDemo6.java中得到错误-

Dog cannot be resolved to a typeJava(16777218)

在终端上执行 ls 时,所有三个 java 文件都在同一目录中。

有趣的是,即使在终端中独立进行编译,编译也会失败。这是错误-

payel@payel-Lenovo-ideapad-330-15IKB:~/VisualStudioCode/John_Purcell_Java_Basics$ java InheritanceDemo6.java
InheritanceDemo6.java:3: error: cannot find symbol
        Dog dog = new Dog("Rohu");
        ^
  symbol:   class Dog
  location: class InheritanceDemo6
InheritanceDemo6.java:3: error: cannot find symbol
        Dog dog = new Dog("Rohu");
                      ^
  symbol:   class Dog
  location: class InheritanceDemo6
2 errors
error: compilation failed

这里,VSCode中的错误是-

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
        The constructor Dog(String) is undefined
        The method getName() is undefined for the type Dog

        at InheritanceDemo6.main(InheritanceDemo6.java:5)

我 运行 您的代码,经过一些修改后它执行得很好。将 inheritance_demo6 更改为 Inheritance_demo6。但是最好用InheritanceDemo6。 之后,将所有代码保存在文件 InheritanceDemo6.java 中,然后使用 java InheritanceDemo6.java 执行它(如果您使用 Java8 或更高版本 - 我正在使用 Java11)。您将得到结果:

My name is: Rohu
I am eating...

更新 1:

在Java中,class的名称以大写字母开头。此外,最好对复合名称使用驼峰式命名法。使用 MyClass 而不是 My_class 作为 class 名称。并使用 myVariable 而不是 my_variable 作为变量名。

更新 2: 我 运行 Eclipse 上的代码,它运行完美。

问题似乎出在 VSCode 中的程序结构上。我在同一个文件夹下编写所有程序,但由于某些原因它无法正常工作(尽管早些时候,类似的程序工作正常)。

我得到了以下关于堆栈溢出的问题的帮助-

然后我创建了一个单独的包InheritanceDemo

然后我创建了三个文件 - App.javaAnimal.javaDog.java 都在同一个包下 - InheritanceDemo.

现在我的程序运行没有任何错误。

问题在于应用程序入口点(Class 包含 main() 方法)位于 VS-Code 项目/root 级别,不会必须将 VS 代码指向正确的 Class 路径。 Open/expand VS-code 资源管理器并查看 JAVA PROJECTS 视图,查看 class 路径中包含哪些 classes。

开始新项目的一个好方法是使用 VS-code 集成项目管理器:open VS-code > ctrl+shift+p > "create java project" > choose an option with or without management tools (no build tools, maven, gradle, etc)

ps:不使用构建工具仍将使用 VS-Code 来调试、编译和 运行 您的代码。