JEditorPaneHTMLEditorKitParserMethodNoConnectionPending无连接

wen java案例 2

本文目录导读:

JEditorPaneHTMLEditorKitParserMethodNoConnectionPending无连接

  1. 核心原因
  2. 解决方案
  3. 总结排查步骤

这个错误信息看起来像是 JEditorPane、HTMLEditorKit 和解析器方法 组合使用时,抛出了一个关于 "No Connection Pending"(无连接待处理) 的异常或状态。

这个错误通常出现在 Java Swing 的 JEditorPane 组件加载 HTML 内容时,尤其是在处理 相对路径资源(如图片、CSS、iframe 或外部链接) 或者使用 自定义回调、流式解析 时。

以下是该错误的常见原因及解决方案:

核心原因

JEditorPane 使用 HTMLEditorKit 解析 HTML 时,它会尝试从文档的 基础 URL(Base URL) 加载外部资源(如图片 <img src="">、样式表等),这个错误通常发生在以下几种情况:

  1. 没有设置 PageBase URL:你给 JEditorPane 设置了 HTML 文本,但该 HTML 中包含相对路径(<img src="image.png"><a href="page2.html">),而解析器尝试去加载这些资源时,发现没有可用的 HTTP 连接或流式连接待处理。
  2. 异步加载中断HTMLEditorKit 内部使用异步加载器(ImageFetcher 或自定义流式加载),如果加载器在等待一个连接完成,但连接因为某种原因被提前关闭、取消或从未启动,就会报 "No Connection Pending"。
  3. 自定义 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 以捕获异常并忽略

如果无论如何都避免不了,可以重写 HTMLEditorKitcreateDefaultDocument() 方法,或者在解析回调中捕获 IOException 并忽略。

editorPane.setEditorKit(new HTMLEditorKit() {
    @Override
    public Document createDefaultDocument() {
        HTMLDocument doc = (HTMLDocument) super.createDefaultDocument();
        // 自定义一个不抛异常的获取方法
        return doc;
    }
    // 或者尝试重写视图工厂
});

总结排查步骤

  1. 检查 HTML 内容:HTML 里是否有 srchref 指向了外部链接但没有协议头(如 //example.com)或相对路径?
  2. 检查 Base URL:是否设置了 doc.setBase(...) 或调用了 setPage()
  3. 打印异常堆栈:最直接的方法,将这个异常用 try-catch 包住,看具体是哪一行代码触发,以及它的消息细节。
try {
    editorPane.setText(html);
} catch (Exception e) {
    e.printStackTrace(); // 看这里的具体信息
}

如果以上方法还不能解决,请提供你的 Java 代码片段HTML 示例内容,我可以帮你更精确地定位问题。

抱歉,评论功能暂时关闭!