Eclipse调试Java时printf报‘source not found’但控制台输出正常的解决方法
Eclipse调试时System.out.printf出现'Source Not Found'的解决方案
看起来你遇到的这个'Source Not Found'错误并不是你的代码有问题,而是Eclipse调试器无法找到JDK自带类库的源码导致的。当你调试时不小心进入了System.out.printf这个JDK内置方法,而Eclipse没有关联JDK的源码包,就会弹出这个错误提示。好在控制台能正常输出,说明你的printf代码本身是没问题的。
下面是具体的解决步骤:
1. 关联JDK源码到Eclipse
这是最彻底的解决方法,以后调试任何JDK内置方法都不会再报错:
- 打开Eclipse的偏好设置:Windows用户点击
Window > Preferences,Mac用户点击Eclipse > Preferences - 展开
Java > Installed JREs,选中你当前项目使用的JDK(注意是JDK不是JRE),点击右侧的Edit按钮 - 在弹出的窗口里,找到
rt.jar并展开它,你会看到Source Attachment这一项,当前应该显示(none) - 点击
Source Attachment,然后点击右侧的External File...,找到你JDK安装目录下的src.zip文件(通常在JDK根目录里,比如C:\Program Files\Java\jdk1.8.0_301\src.zip) - 确认后保存设置,重新启动调试,这个错误就会消失了
2. 调试时跳过JDK类的方法
如果你暂时不想关联源码,也可以通过调试技巧避免进入JDK的代码:
- 调试时,使用
Step Over(快捷键F6)而不是Step Into(快捷键F5):Step Over会直接执行完当前行的代码,不会进入方法内部,这样就不会触发JDK源码找不到的错误 - 如果不小心进入了JDK方法,点击调试工具栏的
Step Return(快捷键F7)就能回到你自己的代码中继续调试
额外提示:你的代码中存在的潜在问题
虽然这个调试错误和你的业务逻辑无关,但我注意到你的printQueue方法会修改原队列:每次调用poll()都会移除队列中的元素。这会导致第一次调用printQueue后,processes队列就空了,后续的FCFS(processes, ...)和第二次printQueue拿到的都是空队列,这很可能是你后续代码无法正常执行的真实原因。
你可以修改printQueue方法,用遍历的方式而不是移除元素:
public static void printQueue (Queue<Process> processes, int numProcesses) { System.out.printf("The original input was: "); // 使用增强for循环遍历队列,不会修改原队列的内容 for (Process curElement : processes) { System.out.printf("a: %d\n", curElement.a); System.out.printf("%d %d %d %d ", curElement.a, curElement.b, curElement.c, curElement.io); } System.out.print("\n\n"); }
或者如果必须使用poll,可以先复制一份队列再操作:
public static void printQueue (Queue<Process> processes, int numProcesses) { // 创建队列的副本,避免修改原队列 Queue<Process> tempQueue = new LinkedList<>(processes); System.out.printf("The original input was: "); Process curElement = tempQueue.poll(); while(curElement != null) { System.out.printf("a: %d\n", curElement.a); System.out.printf("%d %d %d %d ", curElement.a, curElement.b, curElement.c, curElement.io); curElement = tempQueue.poll(); } System.out.print("\n\n"); }
内容的提问来源于stack exchange,提问作者Alex Kang




