Java类加public修饰后运行报错、无修饰时可正常执行的咨询
两类代码运行差异的本质原因
编译规则的核心差异
Java语言规范对不同访问级别的类,执行差异化的文件名匹配校验:
- 无任何访问修饰符的包私有类,不强制要求类名与所在
.java源文件名一致,只要语法结构合法,即可正常通过编译、生成可被JVM执行的class文件,这也是最初不加public修饰的代码可以正常运行的根本原因。 - 被
public修饰的类,编译器会执行强制校验:类名必须与所在源文件的文件名完全匹配(包含大小写),否则直接判定为编译不通过。
从报错栈的worksheet.java:2路径可以明确识别,当前的源文件名是worksheet.java,而public类的名称是MyCode,二者不匹配,直接触发了上述校验规则。
特殊报错的来源
遇到的java.lang.Error: Unresolved compilation problem并非JVM在运行时触发的业务逻辑错误,而是Eclipse、IntelliJ IDEA这类内置增量编译模块的IDE的特殊行为:
为了降低调试中断的频率,这类IDE即便检测到存在编译错误,也不会完全阻断class文件的生成流程,而是会在存在编译问题的类的main方法中嵌入一段固定逻辑:被调用时直接抛出带编译错误标识的Error。
如果换做使用JDK自带的javac命令行手动编译,遇到public类与文件名不匹配的问题时,会直接在编译阶段输出明确提示:class MyCode is public, should be declared in a file named MyCode.java,根本不会生成可被JVM加载执行的class文件,也就不会出现这类运行时抛出的编译问题报错。
验证逻辑
将当前的worksheet.java文件重命名为与public类名完全一致的MyCode.java,再运行添加了public修饰的代码,程序即可正常输出指定内容,不存在public类作为程序入口的语法合法性问题。
内容的提问来源于stack exchange,提问作者iyy0v
相关产品推荐
相关产品推荐

