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

Java 为什么我收到的字符串索引超出范围:97?,java,string,input,bounds,Java,String,Input,Bounds,我编了一个西班牙语变位器。例如,如果单击方法isItEr(),则输入单词,然后在开关采样器中输入与表单关联的字母 错误在“案例a:”行中 java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:97(在java.lang.String中) public void isItIr() { System.out.print(“输入不定式:”); 扫描仪输入=新扫描仪(系统输入); 字符串不定式=keyIn.nextLine().toLowerCase(

我编了一个西班牙语变位器。例如,如果单击方法
isItEr()
,则输入单词,然后在开关采样器中输入与表单关联的字母

错误在“案例a:”行中 java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:97(在java.lang.String中)

public void isItIr()
{
System.out.print(“输入不定式:”);
扫描仪输入=新扫描仪(系统输入);
字符串不定式=keyIn.nextLine().toLowerCase();
if(不定式子字符串(不定式.length()-2,不定式.length()).equals(“ir”))
单词=共轭定语(不定式);
}
私有字符串共轭定语(字符串不定式)
{
扫描仪输入=新扫描仪(系统输入);
System.out.println(“选择表单:”);
System.out.println(“a.Yo”);
System.out.println(“b.Tu”);
系统输出打印号(“c.El/Ella/Usted”);
System.out.println(“d.Nosotros”);
System.out.println(“e.Ellos/Ellas/Ustedes”);
System.out.println(“f.退出程序”);
System.out.print(“输入选项=>”;
字符串输入=keyIn.nextLine().toLowerCase();
char ch=input.charAt(0);

如果(!(ch>='a'&&ch,这是因为
'a'
是代码重新解释为其代码点的字符(恰好是
97

当你这么做的时候

char idxio = 'a';
word = infinitive.substring(0, idxio) + "o";
该字符串尝试获取短于97的单词中的前97个字符

您可能的意思是查找字母
'a'
的索引,从目标单词的末尾开始,切掉结尾,并将其替换为
'o'
。您可以使用:

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

不要使用
String.substring
。如果您查看
String
类的Javadoc,您将看到
boolean endsWith(字符串后缀)
方法。请使用最自然、最具体的方法


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

请发布完整的堆栈跟踪。这告诉您(和我们)是哪一行导致了错误。A是开关采样器上选项的字母,不是不定式。是的,我是这么想的。我需要做什么不同的事情?@user2994631请查看答案的最后两行。它说它找不到符号-方法lastIndexOf(char)。我的代码中没有该方法,但我知道您的目的。@user2994631啊,当然,这是一个需要对要从中删除结尾的字符串调用的方法。因此,创建该方法?抱歉,不习惯此子字符串这将是一个完美的注释,而不是答案,因为它解释了OP如何优化所需的内容它已经在工作了(也许没有它能发挥的那么有效)但是它没有告诉OP如何解决他的问题。不,因为有了beber,用户可以用5种不同的方式将其共轭,就用“beber”好了,那么你想把endsWith放在哪里?在案例a中?我想你是对的。
endsWith
将替换
isItIr
第四行中的子字符串代码。
int idxio = infinitive.lastIndexOf('a');
word = infinitive.substring(0, idxio) + "o";