Split 方法抛出 IndexOutOfBounds 异常
Split method throwing an IndexOutOfBounds Exception
我正在尝试使用数组制作电话簿(我必须使用数组)。我正在尝试编写添加新条目的方法。我决定添加一个新条目,其中一行将使用 split
方法拆分为带有制表符的三个部分(姓氏、首字母、数字)。当我尝试对该方法进行测试时,我得到了 IndexOutOfBoundsException
.
这是addEntry
方法
@Override
public void addEntry(String line) {
String[] entryLine = line.split("\t");
String surname = entryLine[0];
String initial = entryLine[1];
String number = entryLine[2];
Entry entry = new Entry(surname, initial, number);
count++;
if (surname == null || initial == null || number == null) {
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
}
if (count == entries.length) {
Entry[] tempEntries = new Entry[2 * count];
System.arraycopy(entries, 0, tempEntries, 0, count);
entries = tempEntries;
} else {
int size = entries.length;
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < entries.length; j++) {
String one = entry.getSurname();
if (one.toLowerCase().compareTo(surname.toLowerCase()) > 0) {
Entry tempE = entries[i];
entries[i] = entries[j];
entries[j] = tempE;
}
}
}
}
}
这是我尝试添加的条目:
arrayDirectory.addEntry("Smith SK 005598");
如果您输入的String
确实是
Smith SK 005598
然后你的拆分正则表达式
\t
(制表符) 无法工作,因为各个片段之间没有制表符分隔。
相反,您需要使用
line.split("\s+");
因为 \s+
将匹配任意数量的空格。
输出将正确地导致
[Smith, SK, 005598]
要用制表符分隔每一部分,您需要使用
Smith\tSK\t005598
只有这样你原来的正则表达式才能工作。
而不是逻辑:
if (surname == null || initial == null || number == null)
{
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
}
您应该检查分割线的长度为 3:
String[] entryLine = line.split("\s+");
if (entryLine.length() != 3)
{
throw new IllegalArgumentException("...");
}
因为这些变量不会为空,所以数组访问会导致 IOOB 错误。
你也应该把
Entry entry = new Entry(surname, initial, number);
count++;
大小检查之后(最好将所有前提条件检查放在方法的开头)。
我正在尝试使用数组制作电话簿(我必须使用数组)。我正在尝试编写添加新条目的方法。我决定添加一个新条目,其中一行将使用 split
方法拆分为带有制表符的三个部分(姓氏、首字母、数字)。当我尝试对该方法进行测试时,我得到了 IndexOutOfBoundsException
.
这是addEntry
方法
@Override
public void addEntry(String line) {
String[] entryLine = line.split("\t");
String surname = entryLine[0];
String initial = entryLine[1];
String number = entryLine[2];
Entry entry = new Entry(surname, initial, number);
count++;
if (surname == null || initial == null || number == null) {
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
}
if (count == entries.length) {
Entry[] tempEntries = new Entry[2 * count];
System.arraycopy(entries, 0, tempEntries, 0, count);
entries = tempEntries;
} else {
int size = entries.length;
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < entries.length; j++) {
String one = entry.getSurname();
if (one.toLowerCase().compareTo(surname.toLowerCase()) > 0) {
Entry tempE = entries[i];
entries[i] = entries[j];
entries[j] = tempE;
}
}
}
}
}
这是我尝试添加的条目:
arrayDirectory.addEntry("Smith SK 005598");
如果您输入的String
确实是
Smith SK 005598
然后你的拆分正则表达式
\t
(制表符) 无法工作,因为各个片段之间没有制表符分隔。
相反,您需要使用
line.split("\s+");
因为 \s+
将匹配任意数量的空格。
输出将正确地导致
[Smith, SK, 005598]
要用制表符分隔每一部分,您需要使用
Smith\tSK\t005598
只有这样你原来的正则表达式才能工作。
而不是逻辑:
if (surname == null || initial == null || number == null)
{
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
}
您应该检查分割线的长度为 3:
String[] entryLine = line.split("\s+");
if (entryLine.length() != 3)
{
throw new IllegalArgumentException("...");
}
因为这些变量不会为空,所以数组访问会导致 IOOB 错误。
你也应该把
Entry entry = new Entry(surname, initial, number);
count++;
大小检查之后(最好将所有前提条件检查放在方法的开头)。