使用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
相关产品推荐
相关产品推荐

