Java运行报错can't find main(String[]) method in class: Student如何解决
报错根因
你用Java 11+新增的单文件直接运行特性(java xxx.java)执行代码时,会遵循如下规则:
- 如果文件中存在
public类,该类名必须与文件名完全一致,JVM会默认查找该public类下的main方法作为入口 - 如果文件中没有
public类,JVM会默认查找文件中第一个顶层类下的main方法作为入口
你的代码里第一个类是Student,没有定义main方法,main方法在第三个类StudentDataInheritance中,因此JVM检索入口方法失败抛出报错。
另外你的代码还存在两处隐含bug:
- Java大小写敏感,你定义的方法为
printData(),main方法中调用时写为printdata(),运行时会抛出方法找不到错误 Scanner调用nextInt()读取整数后,输入缓冲区会遗留未读取的换行符,后续执行sc.nextLine()读取gender时会直接读到空字符串,导致输入跳过
解决方法
方案1(适配单文件直接运行)
把StudentDataInheritance类声明为public(和文件名保持一致),同时修复另外两处隐含bug,修改后完整代码如下:
import java.util.Scanner; class Student { String name, gender; int roll; int mark1, mark2, mark3; void print() { System.out.println("Name: " + name); System.out.println("Roll: " + roll); System.out.println("Gender: " + gender); } } class MarkStudents extends Student { void printData() { int total = mark1 + mark2 + mark3; System.out.println("Marks\nMaths: " + mark1 + "\nChemistry: " + mark2 + "\nComputer: " + mark3 + "\nTotal: " + total + "\nGrade: "); if (total >= 90) System.out.print("A"); else if (total >= 80) System.out.print("B"); else if (total >= 70) System.out.print("C"); else if (total >= 60) System.out.print("D"); else if (total >= 50) System.out.print("E"); else System.out.print("F"); } } public class StudentDataInheritance { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the Student details\nName: "); String name = sc.nextLine(); System.out.println("Roll no: "); int roll = sc.nextInt(); sc.nextLine(); // 吃掉nextInt遗留的换行符 System.out.println("Enter the gender: "); String gender = sc.nextLine(); System.out.println("Mark1: "); int m1 = sc.nextInt(); System.out.println("Mark2: "); int m2 = sc.nextInt(); System.out.println("Mark3: "); int m3 = sc.nextInt(); MarkStudents m = new MarkStudents(); m.name = name; m.roll = roll; m.gender = gender; m.mark1 = m1; m.mark2 = m2; m.mark3 = m3; m.print(); m.printData(); } }
修改后直接执行java StudentDataInheritance.java即可正常运行。
方案2(传统编译运行流程)
不需要调整类的声明,修复两处隐含bug后,先执行编译命令:javac StudentDataInheritance.java
编译完成后执行运行命令指定入口类即可:java StudentDataInheritance
内容的提问来源于stack exchange,提问作者Vishnudas V
相关产品推荐
相关产品推荐

