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.java
、Animal.java
和 Dog.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 来调试、编译和 运行 您的代码。
这里我有一个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.java
、Animal.java
和 Dog.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 来调试、编译和 运行 您的代码。