You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动