java.lang.IndexOutOfBoundsException异常求助:索引308超出集合大小308
解决Java代码中的IndexOutOfBoundsException异常
嘿,我来帮你拆解下这个问题!你遇到的java.lang.IndexOutOfBoundsException: Index: 308, Size: 308异常,核心原因其实很直观:
异常根源
你在循环里用ips.size()作为遍历的上限,但**ports列表的长度比ips短**。列表的索引是从0开始的,最大有效索引是size()-1,当i等于ports.size()(也就是308)时,ports.get(i)自然就超出了列表的范围,触发越界异常。
为什么ips和ports长度不一致?大概率是网页结构有变动,或者某些行的端口数据缺失——你通过两个独立的XPath抓取IP和端口,理论上每行应该对应一对,但实际爬取时可能出现数据不匹配的情况。
修复方案
我给你几个关键的修复点:
统一循环上限:循环时取两个列表中较小的长度作为上限,彻底避免访问不存在的索引:
int maxSize = Math.min(ips.size(), ports.size()); for(int i=0;i<maxSize;i++){ // 原循环逻辑保持不变 }修复第二个循环的潜在越界问题:你第二个循环用
ips.size()遍历proxies,但proxies的长度可能比ips短(因为你有过滤条件if(!(temp.matches(".*[a-z].*")))),所以必须用proxies.size()作为上限:for (int i=0;i<proxies.size();i++){ System.out.println(proxies.get(i)); }可选:添加长度校验日志:如果想排查数据不匹配的具体原因,可以在循环前加个判断:
if(ips.size() != ports.size()){ System.out.println("警告:IP和端口数量不匹配!IP数量:"+ips.size()+",端口数量:"+ports.size()); }
完整修复后的代码示例
HtmlPage page = null; List<HtmlElement> ips = null ; List<HtmlElement> ports = null ; ArrayList<String> proxies = new ArrayList(); String temp; String baseUrl = "https://free-proxy-list.net/" ; WebClient client = new WebClient(); client.getOptions().setCssEnabled(false); client.getOptions().setJavaScriptEnabled(false); try{ page = client.getPage(baseUrl); ips = page.getByXPath("//table/tbody/tr/td[position()=1]/text()"); ports = page.getByXPath("//table/tbody/tr/td[position()=2]/text()"); // 添加长度校验,排查数据不匹配问题 if(ips.size() != ports.size()){ System.out.println("警告:IP和端口数量不匹配!IP数量:"+ips.size()+",端口数量:"+ports.size()); } int maxSize = Math.min(ips.size(), ports.size()); for(int i=0;i<maxSize;i++){ System.out.println("IP: "+ips.get(i)); temp=(ips.get(i)+":"+ports.get(i)); System.out.println("Temp: "+temp); if(!(temp.matches(".*[a-z].*"))){ proxies.add(temp); } } // 修复第二个循环的上限,避免越界 for (int i=0;i<proxies.size();i++){ System.out.println(proxies.get(i)); } } catch(Exception e){ e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Massimo Simone




