本文目录导读:

这个错误信息看起来像是 JEditorPane、HTMLEditorKit 和解析器方法 组合使用时,抛出了一个关于 "No Connection Pending"(无连接待处理) 的异常或状态。
这个错误通常出现在 Java Swing 的 JEditorPane 组件加载 HTML 内容时,尤其是在处理 相对路径资源(如图片、CSS、iframe 或外部链接) 或者使用 自定义回调、流式解析 时。
以下是该错误的常见原因及解决方案:
核心原因
当 JEditorPane 使用 HTMLEditorKit 解析 HTML 时,它会尝试从文档的 基础 URL(Base URL) 加载外部资源(如图片 <img src="">、样式表等),这个错误通常发生在以下几种情况:
- 没有设置
Page或Base URL:你给JEditorPane设置了 HTML 文本,但该 HTML 中包含相对路径(<img src="image.png">或<a href="page2.html">),而解析器尝试去加载这些资源时,发现没有可用的 HTTP 连接或流式连接待处理。 - 异步加载中断:
HTMLEditorKit内部使用异步加载器(ImageFetcher或自定义流式加载),如果加载器在等待一个连接完成,但连接因为某种原因被提前关闭、取消或从未启动,就会报 "No Connection Pending"。 - 自定义
EditorKit或回调冲突:如果你自己实现了HTMLEditorKit的子类,或者重写了ParserCallback,在某些方法中错误地认为有连接在等待。
解决方案
请根据你的代码场景选择对应的修复方法:
方案 1:为 JEditorPane 设置一个虚拟的 Base URL
如果你只是显示一段本地生成的 HTML(例如从数据库读取的、或者硬编码的字符串),不要使用相对路径,如果必须使用相对路径,请设置一个 Page 或通过 Document 属性设置 Base URL。
示例代码:
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
// 设置一个虚拟的 Base URL
// 告诉解析器:所有相对路径都从这个虚拟地址开始查找
editorPane.setPage("file:///dummy/");
// 或者使用 setText 后设置 document 属性
String html = "<html><img src='images/logo.png'></html>";
editorPane.setText(html);
// 手动设置文档的基础 URL
HTMLDocument doc = (HTMLDocument) editorPane.getDocument();
doc.setBase(new URL("file:///d:/myapp/"));
为什么有效? 解析器在遇到相对路径时,需要知道从哪里加载资源,提供 base 后,它就不再尝试建立新的 HTTP 连接(除非你指向了 HTTP URL)。
方案 2:禁用图片加载或其他外部资源
如果错误发生在加载图片时,并且你不需要显示网络图片,可以直接关闭图片加载:
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
HTMLEditorKit kit = (HTMLEditorKit) editorPane.getEditorKit();
// 获取默认的样式表并移除图片加载器
// 或者直接使用无图片加载的 EditorKit
// 但更简单的方法是设置属性:
// 注意:没有直接"禁用图片"的官方属性,但可以设置 EditorKit 上的 ImageFetcher
// 如果你自己实现,可以重写 createDefaultDocument 返回一个不加载图片的文档。
更简单的办法: 如果你不需要渲染图片,可以用正则或 Jsoup 先清除 <img> 标签再显示。
方案 3:使用 setText() 代替 setPage()
如果错误是因为你直接调用了 setPage(url),并且该 URL 本身返回的 HTML 里引用了其他不存在的资源,或者连接异常,请确认该 URL 是可访问的。
// bad: 可能会因为资源加载触发 No Connection Pending
// editorPane.setPage("http://example.com/broken.html");
// better: 手动获取 HTML 字符串并设置
String htmlContent = fetchHtml("http://example.com/"); // 你自己的 HTTP 请求
editorPane.setText(htmlContent);
方案 4:自定义 HTMLEditorKit 以捕获异常并忽略
如果无论如何都避免不了,可以重写 HTMLEditorKit 的 createDefaultDocument() 方法,或者在解析回调中捕获 IOException 并忽略。
editorPane.setEditorKit(new HTMLEditorKit() {
@Override
public Document createDefaultDocument() {
HTMLDocument doc = (HTMLDocument) super.createDefaultDocument();
// 自定义一个不抛异常的获取方法
return doc;
}
// 或者尝试重写视图工厂
});
总结排查步骤
- 检查 HTML 内容:HTML 里是否有
src或href指向了外部链接但没有协议头(如//example.com)或相对路径? - 检查 Base URL:是否设置了
doc.setBase(...)或调用了setPage()? - 打印异常堆栈:最直接的方法,将这个异常用
try-catch包住,看具体是哪一行代码触发,以及它的消息细节。
try {
editorPane.setText(html);
} catch (Exception e) {
e.printStackTrace(); // 看这里的具体信息
}
如果以上方法还不能解决,请提供你的 Java 代码片段 和 HTML 示例内容,我可以帮你更精确地定位问题。