为什么我收到字符串索引超出范围:97?

时间:2014-01-13 02:54:56

标签: java string input bounds

我编写了一个西班牙语共轭者。例如,如果单击方法isItEr(),则输入单词,然后在交换机采样器中输入与表单关联的字母。

错误在'case a:'的行上 java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:97(在java.lang.string中)

public void isItIr()
{
    System.out.print("Enter the infinitive: ");
    Scanner keyIn = new Scanner(System.in);
    String infinitive = keyIn.nextLine().toLowerCase();
    if(infinitive.substring(infinitive.length()-2, infinitive.length()).equals("ir"))
           word = conjugateEndingIr(infinitive);
}

private String conjugateEndingIr(String infinitive)
{
    Scanner keyIn = new Scanner(System.in);

    System.out.println("Choose form: ");

    System.out.println("a. Yo");
    System.out.println("b. Tu");
    System.out.println("c. El/Ella/Usted");
    System.out.println("d. Nosotros");
    System.out.println("e. Ellos/Ellas/Ustedes");
    System.out.println("f. Exit program");

    System.out.print("Enter Choice => ");
    String input = keyIn.nextLine().toLowerCase();
    char ch = input.charAt(0);

    if (!(ch >= 'a' && ch <='e'))
    {
        System.out.println("Invalid Choice!!!");
        System.out.print("Please enter choice again => ");
        input = keyIn.nextLine().toLowerCase();
        ch = input.charAt(0);
    }

    switch( ch)
    {
        case 'a': 
        char idxio = 'a';
        word = infinitive.substring(0, idxio) + "o";
        return word;
        case 'b': 
        char idxesi = 'a';
        word = infinitive.substring(0, idxesi) + "es";
        return word;
        case 'c':
        char idxei = 'a';
        word = infinitive.substring(0, idxei) + "e";
        return word;
        case 'd':
        char idximos = 'a';
        word = infinitive.substring(0, idximos) + "imos";
        return word;
        case 'e':
        char idxeni = 'a';
        word = infinitive.substring(0, idxeni) + "en";
        return word;
        case 'f':
        System.out.println("Goodbye");
        System.exit(-1);
        break;
        default:
        System.out.println("Invalid menu choice");
        System.out.println("Goodbye");
        System.exit(-1);
    }
    return word;
}

`

当我输入beber时,它会使用“选择表单”加载开关采样器,当我输入'a'时,我会收到标题中声明的错误!我该如何解决这个问题?感谢〜

2 个答案:

答案 0 :(得分:1)

这是因为'a'是您的代码重新解释为其代码点的字符(恰好是97)。

当你这样做时

char idxio = 'a';
word = infinitive.substring(0, idxio) + "o";

该字符串尝试获取一个短于97的单词中的前97个字符。

你可能想要的是从目标词的末尾开始找到字母'a'的索引,砍掉结尾,然后用'o'替换它。您可以使用lastIndexOf('a')

int idxio = infinitive.lastIndexOf('a');
word = infinitive.substring(0, idxio) + "o";

答案 1 :(得分:0)

请勿使用String.substring。如果您查看String类的Javadoc,您将看到boolean endsWith(String suffix)方法。使用最自然和特定的方法。

您可能还想使用正则表达式(.*)ir$;如果匹配,则捕获的组是基础。在西班牙语中,您是否可以从单词本身确定共轭的形式,而不是让用户进行干预?