You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jsoup循环爬取雅虎财经数据时遭遇NoSuchElementException问题

解决java.util.NoSuchElementException异常的方案

你遇到的NoSuchElementException是因为load.skip(i).findFirst().get()这行代码中,当i的值超过stockNames.txt文件的实际行数时,findFirst()返回空的Optional,此时调用get()就会触发该异常。另外你的代码还存在重复读取文件、资源管理不规范等问题,下面是修正后的方案:

修改后的代码

public static void gatherLoop() throws IOException {
    // 一次性读取所有股票代码,避免循环内重复IO操作
    List<String> stockCodes = Files.readAllLines(Paths.get("stockNames.txt"));
    
    for (int i = 0; i < stockCodes.size(); i++) {
        String loadString = stockCodes.get(i).trim();
        // 跳过空行,避免生成无效URL
        if (loadString.isEmpty()) {
            continue;
        }
        
        String glURL = "http://finance.yahoo.com/quote/" + loadString + "?p=" + loadString + "&.tsrc=fin-srch";
        
        Document doc = Jsoup.connect(glURL).get();
        Elements contentA = doc.getElementsByClass("D(ib) Fz(18px)");
        
        System.out.println("|------------------------------------------------|");
        // 处理未获取到数据的情况
        String stockName = contentA.isEmpty() ? "未获取到股票名称" : contentA.first().text();
        System.out.println("| " + (i+1) + ". Name: " + stockName);
    }
    
    // 处理文件为空的场景
    if (stockCodes.isEmpty()) {
        System.out.println("Loaded Stocks");
        System.out.println("If Their Is No Stocks Popping Up, You Have No Saved Stocks");
    }
}

关键修改说明

  • 一次性读取文件:将文件读取逻辑放在循环外,用Files.readAllLines一次性获取所有股票代码,避免每次循环重复打开读取文件,同时彻底解决skip(i)越界的问题。
  • 取消硬编码循环次数:以文件实际行数作为循环上限,只遍历存在的股票代码,不会出现超出范围的情况。
  • 处理空行无效数据:通过trim()和空判断跳过文件中的空行,避免生成无效的雅虎财经URL。
  • 安全处理元素获取:对Jsoup返回的元素做空判断,避免因页面结构变化导致的空指针异常。
  • 自动管理资源:Files.readAllLines会自动完成资源关闭,无需手动处理BufferedReader的关闭操作。

内容的提问来源于stack exchange,提问作者Kit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:47:23