You need to enable JavaScript to run this app. Java类加public修饰后运行报错、无修饰时可正常执行的咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 12:15:08