免责声明:这可能最适合作为评论,但不适合有限数量的字符。
不错的收获!我以前从未遇到过这个问题,但我设法通过切换 JDK 版本来重现它。我只是java.io.File
从 JDK8 打开并在第 276 行设置断点:
public File(String pathname) {
if (pathname == null) { // <= breakpoint here
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
然后我切换到 JDK6,它在该行上有一个简单的右花括号 ( }
)。但是,当按下CTRL++ (Windows SHIFT)F8时,断点可用,但有旧源文件的描述:
这让我开始思考,所以我试图找出断点的存储位置,结果发现它们位于<project root>/.idea/workspace.xml
以下<component name="XDebuggerManager">
部分:
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
...
<line-breakpoint enabled="true" type="java-line">
<url>jar://C:/Program Files/Java/jdk1.8.0_45/src.zip!/java/io/File.java</url>
<line>275</line>
<properties />
<option name="timeStamp" value="4" />
</line-breakpoint>
</breakpoints>
...
所以看起来它保留了对初始文件的引用。我不确定当您使用 maven、gradle 等时断点是否仍会出现在列表中,在这种情况下,很容易从本地 repo 引用旧 jar 的路径,但此时我无论如何不要认为这很重要。
快速解决方法(也许?!):尽管如此,如果您手动从 xml 中删除幻像断点并保存文件,IJ 将自动获取更改并更新设置。至少在这样做之后,断点不再出现在我的列表中。
在他们的跟踪器上快速搜索发现这个影响 v14.1.1(我目前在 14.1.6 上)的问题似乎还没有修复,所以我想我们只需要等到它得到修复(不知何故,因为对现在我想不出一个简单/体面的方法)。