我目前正在开发一个程序,用一个单词找到第一个辅音。以下是主类的代码:
consonantLoop = 0;
while(!consonantFound) {
currentLetter = characters.get(consonantLoop);
for(int x = 0; x < consonants.size(); x++) {
if(currentLetter == consonants.get(x)) {
consonantFound = true;
System.out.println("The first constanent in the word is " + consonants.get(x).toString());
} else {
consonantLoop++;
}
}
}
我使用变量consonantLoop
来识别我正在检查的单词的字母是否是元音。 consonantFound
是一个布尔值,表示是否找到了第一个辅音。 currentLetter
是一个字符,用于定义我当前正在检查的字母。 characters
是存储我的角色的arraylist。 consonants
是存储辅音的数组。但是,当我运行代码并且秒号是一个辅音时,它会给我这个错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 42, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at testing.Main.main(Main.java:44)
第44行是currentLetter = characters.get(consonantLoop);
在@RajenRaiyare的帮助下,我已经能够编辑我的代码,所以我不会再有任何错误:
consonantLoop = 0;
while(!consonantFound) {
try {
currentLetter = characters.get(consonantLoop);
for(int x = 0; x < consonants.size(); x++) {
if(currentLetter == consonants.get(x)) {
consonantFound = true;
System.out.println("The first consonant in the word is " + consonants.get(x).toString());
} else {
consonantLoop++;
}
}
} catch(IndexOutOfBoundsException e) {
break;
}
}
然而现在输入单词后,程序才会终止。有什么问题?
答案 0 :(得分:2)
目前你正在做的是你只是在增加constantLoop计数器但不检查它是否小于你从中获取记录的arraylist的大小。因此,如果constantLoop的值等于arraylist的大小,则意味着它将给出IndexOutOfBoundsException。
解决这个问题的两种方法
1
catch IndexOutOfBoundsException and do break from it.
2
if (constantLoop < characters.size()) {
currentLetter = characters.get(constantLoop);
}else{
break;
}
答案 1 :(得分:2)
您的代码有两个主要问题。首先,当你点击列表末尾时(或者在新版本中,你使用一种非常奇怪的方式),你不会停止。其次,您为每个辅音consonantLoop
提升currentLetter
一次。您只希望为currentLetter
的每个值执行一次此操作。这样增量的最简单方法是使用for
循环而不是while
:
for (int consonantLoop = 0; consonantLoop < characters.size() && !consonantFound;
consonantLoop++) {
...
}
尽管使用循环计数器是不必要的复杂功能。 for-each循环是一种更简洁的迭代characters
内容的方法。在我们处理它的同时,我们可以通过调用contains
方法来替换笨重的内循环:
for (Character c : characters) {
if (consonants.contains(c)) {
System.out.println("First consonant: " + c);
break;
}
}
break
结束循环,因为我们无法使用带有for-each循环的consonantFound
标记。
答案 2 :(得分:0)
如果您在没有任何辅音的情况下得到一个字,那么您没有测试可以避免consonantLoop
超出characters
的大小。
你应该写你的循环:
while ((!consonantFound) && (consonantLoop < characters.length())) {
...
}