“线程中的异常”;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.charAt处的5(String.java:646)

“线程中的异常”;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.charAt处的5(String.java:646),java,Java,下面的程序是来自hackerrank的《权力的游戏-1》问题。但我在执行时面临给定的错误。 如果有人能帮忙,我将不胜感激。 错误是: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5 at java.lang.String.charAt(String.java:646) 这是我的密码 import java.io.*; import java.ut

下面的程序是来自hackerrank的《权力的游戏-1》问题。但我在执行时面临给定的错误。 如果有人能帮忙,我将不胜感激。 错误是:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:646)
这是我的密码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.Arrays;

public class try123 
{
    public static void main(String[] args) 
    {
        Scanner myScan = new Scanner(System.in);
        String inputString = myScan.nextLine();
        String s=inputString;        //abccba
        String ans;     //YES or NO
        String A="";
        int flag=0;  
        String news="";
        String nrev="";
        String rev="";
        //char arr[]=new char[100000];
        char arr[]=inputString.toCharArray();
        Arrays.sort(arr);
        String b= new String(arr);   //sorted string

        int len=b.length();
        if((len%2)!=0)
        { 
            A=b.substring(len-1,len);

            len=len-1;
            b=b.substring(len-1);
            flag=1;
        }
        for(int l=(len-1);l>=0;l--)
        {
            rev=rev+b.charAt(l);
        }
        for(int i=1;i<len;i=i+2)  //len=6
        {
            news=news+b.charAt(i)+rev.charAt(i-1);
        }
        if(flag==1)
            news=news.substring(0,(len/2)-1)+A+news.substring((len/2),len-1);
        for(int o=(news.length()-1);o>=0;o--)
        {
            nrev=nrev+b.charAt(o);
        }
        if(news==nrev)
            ans="YES";
        else
            ans="NO";
        System.out.println(ans);  
        myScan.close();
    }
}
import java.io.*;
导入java.util.*;
导入java.text.*;
导入java.math.*;
导入java.util.regex.*;
导入java.util.array;
公共课try123
{
公共静态void main(字符串[]args)
{
Scanner myScan=新扫描仪(System.in);
String inputString=myScan.nextLine();
字符串s=inputString;//abccba
字符串ans;//是或否
字符串A=“”;
int标志=0;
字符串新闻=”;
字符串nrev=“”;
字符串rev=“”;
//字符arr[]=新字符[100000];
char arr[]=inputString.toCharArray();
数组。排序(arr);
字符串b=新字符串(arr);//已排序的字符串
int len=b.长度();
如果((长度%2)!=0)
{ 
A=b.子串(len-1,len);
len=len-1;
b=b.子串(len-1);
flag=1;
}
对于(int l=(len-1);l>=0;l--)
{
rev=rev+b.字符(l);
}
对于(int i=1;i=0;o--)
{
nrev=nrev+b.charAt(o);
}
如果(新闻==nrev)
ans=“是”;
其他的
ans=“否”;
系统输出打印LN(ans);
myScan.close();
}
}

问题似乎在这里:

for(int i=1;i<len;i=i+2)  //len=6
{
    news=news+b.charAt(i)+rev.charAt(i-1);
}

以下几行将引导您找到错误:

    if ((len % 2) != 0) {
        A = b.substring(len - 1, len);
        len = len - 1;
        b = ;
        flag = 1;
    }
    for (int l = (len - 1); l >= 0; l--) {
        rev = rev + b.charAt(l);
    }
在这些行之前,
len
b
的长度,在第三行,它变成了b的长度-1,然后你放入
b
,这意味着:b的最后2个字符。 现在b是2个字符长,但len仍然是原始长度-1。 然后设置
intl=(len-1)
,然后执行
b.charAt(l)
。B的长度为2个字符,您试图访问超出范围的第l个字符。

问题在于:

   if((len%2)!=0)
   { 
       A=b.substring(len-1,len);
       len=len-1;
       b=b.substring(len-1); // this returns a String with the last 2 characters of
                             // the original
       flag=1;
   }
当输入字符串的长度为奇数时,只保留该字符串的最后两个字符

我想您的意思是只删除字符串的最后一个字符,应该这样做:

   if((len%2)!=0)
   { 
       A=b.substring(len-1,len);    
       len=len-1;
       b=b.substring(0,len); // this would return the original String minus the last
                             // character
       flag=1;
   }

请链接堆栈跟踪,并在代码中指出引发异常的位置和输入。我使用的输入是:cdcdeef,下面是以前发生但现在已解决的错误:我之前也做了同样的操作,但后来我有一个误解,我将其改为此。错误消失了,但是我总是得到NO作为输出。
   if((len%2)!=0)
   { 
       A=b.substring(len-1,len);    
       len=len-1;
       b=b.substring(0,len); // this would return the original String minus the last
                             // character
       flag=1;
   }