JEditorPaneHTMLEditorKitParserMethodNoConnectionPending无连接

wen java案例 2

本文目录导读:

JEditorPaneHTMLEditorKitParserMethodNoConnectionPending无连接

  1. 核心原因:网络连接失败
  2. 常见触发场景
  3. 解决方案

这是一个关于 Java Swing 中 JEditorPaneHTMLEditorKit 的报错问题。

这个错误信息 JEditorPaneHTMLEditorKitParserMethodNoConnectionPending 通常不是一个标准的 Java 异常类名,更可能是 日志输出自定义错误消息 或者 IDE/框架内部调试信息

当你在 Java Swing 中处理 HTML 内容时,JEditorPane 试图加载一个远程 URL(图片、CSS 或页面本身),但网络连接出现问题(超时、DNS 解析失败、代理错误等),就会抛出类似 NoConnectionPendingSocketException 的异常。

该错误信息最可能的来源和分析如下:

核心原因:网络连接失败

JEditorPaneHTMLEditorKit 在解析 HTML 时,如果遇到需要通过 HTTP 加载的资源(<img src="http://..."><link href="http://..."><iframe>),而当前系统没有网络连接、网络被防火墙阻断、或者连接超时,就会触发底层的 NoRouteToHostExceptionSocketException: No buffer space available 等连接错误。

“NoConnectionPending” 字面意思是“没有待处理的连接”,通常发生在 非阻塞 I/O (NIO) 中,但在 Swing 的同步模型中,它可能被包装或误报。

常见触发场景

  • JEditorPane.setPage(String url) 加载远程网页:最常见的场景,直接给 JEditorPane 设置一个 HTTP 链接,但网络不通。
  • JEditorPane.setText() 包含远程图片:HTML 文本里引用了外网的图片地址,解析器尝试异步或者同步加载图片失败。
  • 代理配置问题:在需要代理的网络环境中,Java 没有设置代理参数(http.proxyHosthttp.proxyPort),导致连接被拒绝。
  • HTTPS/SSL 问题:尝试加载 HTTPS 页面,但证书不受信任或 JRE 版本不支持,导致连接在握手阶段失败。

解决方案

根据你的具体场景,可以尝试以下方法:

方案 A:忽略或捕获异常(推荐用于本地 HTML)

如果你只是显示本地生成的 HTML(setText()setPage("file:///...")),并且明确不需要加载外部资源,可以捕获异常并忽略它。

JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
editorPane.setContentType("text/html");
// 设置一个 HTML 内容
editorPane.setText("<html><body><h1>Hello</h1><img src='http://example.com/broken.jpg'></body></html>");
// 禁用主动加载远程图片(重要!)
editorPane.getDocument().addDocumentListener(new DocumentListener() {
    // ... (其他方法)
    @Override
    public void insertUpdate(DocumentEvent e) {
        // 忽略,或在这里处理
    }
});
// 或者直接捕获连接异常
SwingUtilities.invokeLater(() -> {
    try {
        // setPage 失败,会抛出异常
        // editorPane.setPage("http://someurl.com");
    } catch (IOException ex) {
        // 记录日志,但不崩溃
        System.err.println("加载 URL 失败: " + ex.getMessage());
        // 可以显示一个备用的本地 HTML
        editorPane.setText("<html><body>无法加载页面</body></html>");
    }
});

方案 B:禁用远程资源加载(最彻底的解决方案)

如果你想完全禁止 JEditorPane 去尝试连接网络,可以通过自定义 HTMLEditorKit 并重写 getImage 或链接解析方法,或者直接使用 HTMLEditorKitsetDefaultCursor 和连接监听器 的方式并不直接,更简单的方法是在设置文本之前确保没有外部引用,或者使用 Flyweight 模式

简单粗暴的方法: 如果不需要显示图片,直接移除所有 <img>

String html = "<html>...<img src='http://xxx'/>...</html>";
// 替换所有外部资源引用
html = html.replaceAll("<img[^>]*>", ""); // 移除所有图片
editorPane.setText(html);

方案 C:设置正确的网络代理

如果你需要加载外部资源但网络环境需要代理,在启动 JVM 时或代码中设置:

// 在第一次使用 JEditorPane 之前设置
System.setProperty("http.proxyHost", "你的代理IP");
System.setProperty("http.proxyPort", "端口号");
System.setProperty("https.proxyHost", "你的代理IP");
System.setProperty("https.proxyPort", "端口号");

方案 D:在单独的线程中加载

JEditorPane.setPage() 是阻塞的,会阻塞 EDT(事件调度线程),如果网络慢,会导致界面卡死,建议在后台线程加载,加载完成后再更新 UI。

new Thread(() -> {
    try {
        URL url = new URL("http://example.com");
        String html = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A").next();
        SwingUtilities.invokeLater(() -> {
            editorPane.setText(html);
        });
    } catch (Exception e) {
        e.printStackTrace();
        SwingUtilities.invokeLater(() -> {
            editorPane.setText("<html>加载失败</html>");
        });
    }
}).start();
  • 根本原因JEditorPane 试图通过网络加载 HTML 资源,但网络不可用或连接被拒绝。
  • 立即修复:检查你的 HTML 内容中是否含有 http://https:// 的链接、图片、CSS 或 JS。移除这些外部引用
  • 如果不需要网络:使用 setText() 并确保所有资源使用 file:// 协议。
  • 如果确实需要网络:检查代理设置、网络连通性,并考虑在后台线程加载。

如果你能提供引发这个错误的具体代码片段(特别是 setPage()setText() 那几行),我可以给你更精确的修改建议。

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