元音检查 - 数组越界错误

时间:2014-11-15 17:13:23

标签: java runtime-error

我正在尝试编写一个接受小写单词的程序,将其转换为大写,并将单词中的元音更改为下一个字母。到目前为止,我已经这样做了:

import java.util.*;
class prg11
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a word in lowercase.");
        String word = sc.next();
        word = word.toUpperCase();
        int length = word.length();
        char ch[] = new char[length+1];
        for (int i = 0; i<=length; i++)
        {
            ch[i] = word.charAt(i);
            if("aeiou".indexOf(ch[i]) == 0)
            {
                ch[i]+=1;
            }
        }
        String str = new String(ch);
        System.out.println(str);
    }
}

代码编译得很好。但是,当我运行程序并输入一个单词时,说'嘿',这个单词只用大写字母打印。其中的元音(在本例中为“e”)不会更改为下一个字母。 我该如何解决这个问题? TIA。

5 个答案:

答案 0 :(得分:3)

根据问题中的代码,需要更改三个位置。

word = word.toUpperCase();
int length = word.length();

// yours: char ch[] = new char[length + 1];
// resulting array needs to be as same length as the original word
// if not, there will be array index out of bound issues
char ch[] = new char[length];

// yours: for (int i = 0; i<=length; i++)
// need to go through valid indexes of the array - 0 to length-1
for (int i = 0; i < length; i++) {
    ch[i] = word.charAt(i);
    // yours: if ("aeiou".indexOf(ch[i]) == 0) {
    // two problems when used like that
    // 1. indexOf() methods are all case-sensitive
    //    since you've uppercased your word, need to use AEIOU
    // 2. indexOf() returns the index of the given character
    //    which would be >= 0 when that character exist inside the string
    //    or -1 if it does not exist
    //    so need to see if the returned value represents any valid index, not just 0
    if ("AEIOU".indexOf(ch[i]) >= 0) {
        ch[i] += 1;
    }
}

这里有一个简洁的版本。请注意我已完成的更改。

String word = sc.next().toUpperCase();
char ch[] = word.toCharArray();
for (int i = 0; i < ch.length; i++) {
    if ("AEIOU".indexOf(ch[i]) >= 0) {
        ch[i] += 1;
    }
}

indexOf()的Java文档。

public int indexOf(int ch)

Returns the index within this string of the first occurrence of the specified character.
If a character with value ch occurs in the character sequence represented by this String object,
then the index (in Unicode code units) of the first such occurrence is returned.
For values of ch in the range from 0 to 0xFFFF (inclusive), this is the smallest value k such that:

     this.charAt(k) == ch

is true. For other values of ch, it is the smallest value k such that:

     this.codePointAt(k) == ch

is true. In either case, if no such character occurs in this string, then -1 is returned.

Parameters:
    ch - a character (Unicode code point).
Returns:
    the index of the first occurrence of the character in the character sequence represented by this object,
    or -1 if the character does not occur.

答案 1 :(得分:2)

我认为应该这样做,让我知道它是不是

public class prg11 {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a word.");
    String word = sc.next();
    sc.close();
    word = word.toUpperCase();
    int length = word.length();
    char ch[] = new char[length+1];
    for (int i = 0; i<length; i++) {
        ch[i] = word.charAt(i);
        if("AEIOU".indexOf(ch[i]) > -1) {
            ch[i]+=1;
        }
    }
    String str = new String(ch);
    System.out.println(str);
}
}

让我知道它是否有效。
快乐的编码;)-Charlie

答案 2 :(得分:1)

使用:

for (int i = 0; i<length; i++)

而是最后一个索引是length-1。

答案 3 :(得分:1)

使用for (int i = 0; i<=length-1; i++)代替for (int i = 0; i<=length; i++)
if("AEIOU".indexOf(ch[i]) != -1)代替if("aeiou".indexOf(ch[i]) == 0)

原因
1.array index从0开始,这就是为什么length-1
2.因为你已经用大写字母制作了字符串,所以检查&#34; AEIOU&#34;
3.每个非元音字符都将返回-1,因此请使用if("AEIOU".indexOf(ch[i]) != -1)

答案 4 :(得分:1)

"aeiou".indexOf(ch[i]) == 0只匹配'a'个字符(因为那是索引0处的字符)。您应该查找任何大于-1的索引。此外,由于您已经将字符串转换为大写字母,因此您应该检查“AEIOU”而不是“aeiou”。