[英]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.