You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)自然就超出了列表的范围,触发越界异常。

为什么ipsports长度不一致?大概率是网页结构有变动,或者某些行的端口数据缺失——你通过两个独立的XPath抓取IP和端口,理论上每行应该对应一对,但实际爬取时可能出现数据不匹配的情况。

修复方案

我给你几个关键的修复点:

  1. 统一循环上限:循环时取两个列表中较小的长度作为上限,彻底避免访问不存在的索引:

    int maxSize = Math.min(ips.size(), ports.size());
    for(int i=0;i<maxSize;i++){
        // 原循环逻辑保持不变
    }
    
  2. 修复第二个循环的潜在越界问题:你第二个循环用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));
    }
    
  3. 可选:添加长度校验日志:如果想排查数据不匹配的具体原因,可以在循环前加个判断:

    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

火山引擎 最新活动