繁体   English   中英

Java子字符串方法提供IndexOutOfBoundsException

[英]Java substring method giving IndexOutOfBoundsException

我试图通过查看每个元素的第一个单词来分隔String [] adr = {"Tel Iva +38712345", "Mail Iva ivag@gmail.com", "Tel Ana +12345678"} 如果第一个单词是Mail ,则转到String [] m ;如果第一个单词是Tel ,则转到String [] t

这是我的代码:

public static void rep(String a, String []adr) {

    int mail=0, tel=0;
    for (int i=0; i<adr.length; i++) {
        if(adr[i].substring(0, 3).equals("Mail")) {
            mail++;
        }
        else tel++;
    }
    String [] m = new String [mail];
    String [] t = new String [tel];

    for(int i=0; i<adr.length; i++) {
        if(adr[i].substring(0, 4).equals("Mail")) {
            m[i]=adr[i].substring(5);
        }

        else t[i]=adr[i].substring(4);
        System.out.println(adr[i].substring(0, 4));
    }
}

但是由于某种我不知道的原因,我得到了

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

指向m[i]=adr[i].substring(5) 我真的不明白为什么。 任何帮助,将不胜感激。

正确的解决方案。 您需要两个索引来跟踪m和t数组的遍历。

公共静态无效值rep(String a,String [] adr){

    int mail=0, tel=0;
    for (int i=0; i<adr.length; i++)
    {
        if(adr[i].substring(0, 4).equals("Mail")) {
            mail++;
        }
        else tel++;
    }
    String [] m = new String [mail];
    String [] t = new String [tel];
    int mIndex =0, tIndex = 0;

    for(int i=0; i<adr.length; i++) {
        if(adr[i].substring(0, 4).equals("Mail")) {
            m[mIndex]=adr[i].substring(4);
            mIndex++;
        }
        else
        {
            t[tIndex]=adr[i].substring(4);
            tIndex++;
        }
        System.out.println(adr[i].substring(0, 4));
    }
}

好吧,您可以尝试这种方法,当我为我的学者学习Java时,我曾经编码过相同类型的问题。 好吧,您也可以尝试使用StringTokenizer方法执行相同的操作。 也许他们做得更好。 我期望您将插入整个字符串,而不是拆分成一个。

import java.util.*;
import java.lang.*;
import java.*;

public class stringtoken{


  public static void main(String args[]){


         List<String> m=new ArrayList<String>();
         List<String> t=new ArrayList<String>();

         String[] s={"Tel Iva +38712345", "Mail Iva ivag@gmail.com", "Tel Ana +12345678"};

         for(int i=0;i<s.length;i++){

                 if(s[i].indexOf("Tel")==0){

                       t.add(s[i]);
                 }
                 else if(s[i].indexOf("Mail")==0){
                       m.add(s[i]);
                 }
         }

         for(int i=0;i<m.size();i++){
                System.out.println(m.get(i));
         }
         for(int i=0;i<t.size();i++){
               System.out.println(t.get(i));
         }
     }
 }

假设您在substring方法中使用的索引是正确的,而我只会谈论数组的索引:

字符串[] adr = {“ Tel Iva +38712345”,“ Mail Iva ivag@gmail.com”,“ Tel Ana +12345678”}

通过此数据,

邮件数组大小1 ,可用于邮件数组的最大索引为0

tel数组大小2 ,tel数组可以使用的最大索引为1

for(int i=0; i<adr.length; i++) {
    if(adr[i].substring(0, 4).equals("Mail")) {
        m[i]=adr[i].substring(5);
    }

    else t[i]=adr[i].substring(4);
    System.out.println(adr[i].substring(0, 4));
}

在此循环中:

循环1:i = 0-> t [0] = xxx; ->好

循环2:i = 1-> m [1] = xxx; ->错误,因为m数组的大小为1,索引只能为0

PS:您需要检查子字符串方法中使用的索引

假设此样本地址数组(您的参数adr [])

adr[0] = Maila@a.com
adr[1] = Tele123456
adr[2] = Mailb@a.com
adr[3] = Tele123456
adr[4] = Mailc@a.com

在第一个循环之后,即为int mail和tel分配值

mail = 3;
tel = 2

因此您的m和t数组如下所示。

    String [] m = new String [3];
    String [] t = new String [2];

在最后一次循环adr(您的参数数组)长度为5时发生了什么。

并尝试通过adr数组的索引将值分配给m或t。

例如: adr[3] = Tele123456

在第二个循环中,当i = 3时,您将获得此值并尝试将其分配给

t[3] = 123456

实际上t的大小是2,然后发生数组超出范围的异常。

希望您了解代码中的问题。

而不是m和t的数组使用List。

考虑下面的例子。

public static void rep(String a, String []adr) {

    List<String> mails = new ArrayList<>();
    List<String> teles = new ArrayList<>();
    for (int i=0; i<adr.length; i++) {
        if(adr[i].substring(0, 3).equals("Mail")) {
            mails.add(adr[i].substring(5));
        } else {
           mails.add(adr[i].substring(5));
        }
    }
}

**注意:如果存在,请修复编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM