Compilation unit name must end with .java, or one of the registered Java-like extensions (a error分析)

本文探讨了在MyEclipse中设置断点后保存代码失败的问题,并通过实验验证了断点对代码保存的影响。分析了不同IDE(如VS)在调试过程中对代码修改的支持情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   今天在改动项目代码的时候, 进行保存的代码, 保存不成功, tomcat报错:    Save Failed Compilation

unit name must end with .java, or one of the registered java-like extensions.

 

 

   1 首先分析这句英文的意思.

 

   Save Failed*(保存失败) Compilation(编译) unit(单元) name(名称) must end with(结束) .java, or one

of the registered(被注册) java-like extensions. (类似java扩展) (保存失败,编译单元名称必须结束,类似java

扩展被注册)

 

    2 网上给出答案是, 要删除删除断点才能继续进行保存. 

 

   究竟为什么则样做我们的修改的代码就可以继续保存了?我们进行了如下实验.

   A 启动tomcat服务器, 不设置断点, 改动项目中的代码.

   可以进行保存, 没有任何的错误提示.

   B 启动tomca服务器, 设置断点, 改动项目中的代码.

   不可以进行保存, 仍然是报如上面的错误.

   C 不启动tomcat服务器, 直接设置断点, 改动项目中的代码进行保存.

   不可以进行保存, 仍然报错.

 

 

   3 结论:

 

   从中我们可以发现 , 无论我们启动还是不启动服务器, myeclipse中的代码如果设置了断点, 我们就不能再进行

代码改动了. 这是myeclipse编译器为我们设置的. 因为在改动源代码的时候,保存这个动作时,就会触发编译器去重

新编译你刚刚修改的类. 就像有个线程在监控着程序, 一旦有改动, 便自动编译.

   而断点, 是在运行的时候才发挥效果的, 最后一次修改后,设置断点的时候就已经完成编译的工作了. 接下来打

开网页就是运行了, 运行阶段遇到断点停下来进行调试. 所以在编译中不能有断点, 这就是为什么有断点的时候我们

进行保存源代码无法保存的原因了.

   这让我们想到VS中设置断点的时候,同样是不能改动代码的 . 但在VS中有一个调试选项,编译并继续这个选项,据

说可以在调试的过程中进行编译, 但事实上, 大多数人说即使选择了这一项也是不允许的, 还要看你调试执行的位置

和你修改代码的关系,有事即使你改了代码也是只有在下次调试才能真正生效.

   而myeclipse中有这样的选项, Activate the workbench when a breakpoint is hit (当设置断点的时候激活工

作台)似乎和VS中的编译并继续类似, 但结果是我们在有断点的时候是不能进行编译的.

 

 

   这就涉及到编译器的构造了,编译器原本的代码我们不清楚哦!.....vs编译器和myeclipse编译器在编译的过程是怎么回事呢?去官网上(代理:http://www.coobai.com/  官网:www.myeclipseide.com ) ,找了找似乎也没有答案,最

终告诉我们,有断点的时候, 不能改动代码的.去掉断点才可以. 复制项目的时候也是最好去掉程序中的断点再

进行复制. 

 

   一些观点一定存在很多的问题的,期待您的指出.

 

### Java 编译错误 `java.lang.Error: Unresolved compilation problem` 的解决方案 当遇到 `java.lang.Error: Unresolved compilation problem` 错误时,通常表示代码存在语法或其他编译器无法解析的问题。以下是可能的原因及其对应的解决方案: #### 1. **未正确导入包** 如果文件是从其他位置复制而来,在 Eclipse 或其他 IDE 中直接粘贴可能导致缺少必要的包声明。这种情况下,需确认文件顶部是否有正确的 `package` 声明以及所需的 `import` 语句[^1]。 例如: ```java // 正确的包声明 package test2; // 导入所需类库 import java.util.ArrayList; ``` 如果没有正确设置包路径或遗漏了某些依赖项,则会触发此错误。 #### 2. **嵌套内部类实例化问题** 对于非静态嵌套类(non-static nested class),创建其对象时需要通过外部类的一个实例来完成。否则会出现类似于以下错误提示:“No enclosing instance of type PersonTest is accessible.” 这是因为非静态成员类隐含对外部类实例的引用关系[^2]。 修复方法如下所示: ```java public class OuterClass { public static void main(String[] args) { // 创建外层类实例 OuterClass outerInstance = new OuterClass(); // 利用该实例构建内嵌类的对象 InnerClass innerObject = outerInstance.new InnerClass(); } class InnerClass { } } ``` #### 3. **项目配置不一致或者资源缺失** 有时即使源码本身无明显缺陷仍会发生此类异常现象,这可能是由于工作空间设定不当所致。比如 JDK 版本冲突、classpath 设置有误等问题也可能引发类似的编译期难题。建议重新审视项目的 build path 配置并清理重建工程以排除潜在干扰因素。 另外值得注意的是,Eclipse 等开发工具自带的一些快捷键操作如 Ctrl+Shift+O 自动调整 imports 可能帮助快速定位部分基础性失误之处。 --- ### 提供一段示范代码用于验证以上提到的情况之一——关于内外部类的关系处理 ```java class EnclosingTypeExample { private String message = "Hello from enclosing"; // 定义一个非静态内部类 class NestedNonStaticClass { public void displayMessage() { System.out.println(message); } } public static void main(String[] args){ try{ // 下面这一行将会抛出同样的 'Unresolved compilation' 类型错误除非按照规定方式初始化 // NestedNonStaticClass wrongInstantiation = new NestedNonStaticClass(); // 正确的做法应该是这样的... EnclosingTypeExample ete = new EnclosingTypeExample(); EnclosingTypeExample.NestedNonStaticClass nsc = ete.new NestedNonStaticClass(); nsc.displayMessage(); }catch(Exception e){ e.printStackTrace(); } } } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值