字符串索引OutOfBoundsException?

时间:2016-03-25 00:42:30

标签: java string reverse indexoutofboundsexception

我的任务是反转字符串并打印反转的字符串。

这是我的代码

import java.util.*;
import java.io.*;
public class reverse1
{
  public static void reverse(String x) throws IllegalCharacterException
  {
    char j;
    int max;
    String reversedString = " ";
    for(int i = 0; i < x.length() - 1; i++)
    {
      max = x.length();
      j = x.charAt(i);
      j = reversedString.charAt(max);
      i--;
    }//end for loop

   }//end method

 public static void main(String[] args) throws IllegalCharacterException
 {
   Scanner keyboard = new Scanner(System.in);
   String s;
   System.out.println("Please enter a string");
   s = keyboard.next();
   reverse(s);
 }//end main

}//end class

我一直收到这个错误:

java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(Unknown Source)
at reverse1.reverse(reverse1.java:14)
at reverse1.main(reverse1.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

我检查过提到的行号,但仍然不了解问题。我确实将x.length()更改为x.length() - 1,因为朋友告诉我这样做,但我一直都遇到同样的错误。

4 个答案:

答案 0 :(得分:1)

你的问题在于:

String reversedString = " ";

写完几行之后:

j = reversedString.charAt(max); // while the reversedString.length() == 1

这就是你收到错误的原因。您已将x.length()max(显然为6)和reverseString混淆了{{1}},它总是等于&#34; &#34;并且永远不会超过1。

答案 1 :(得分:1)

看起来你正在编写一个程序来反转一个字符串。但乍看之下,我认为你远非解决方案。

但不要担心!抛出异常的原因是你在字符串中的max索引处获得了字符&#34; &#34 ;.字符串&#34; &#34;只有一个字符 - 一个空格。这意味着它只有一个索引0.如果您尝试访问索引6或7或8处的字符或0以外的某个值,则会出现异常!

为什么不使用StringBuilder类中提供的反向方法? 疯狂易于使用!将此代码放在reverse方法中:

StringBuilder builder = new StringBuilder(x);
builder.reverse();
x = builder.toString();
System.out.println(x);

让我们逐行看一下。

StringBuilder builder = new StringBuilder(x);

这将创建一个新的StringBuilder,其初始字符串为x,该参数将传递给该方法。

builder.reverse();

此行会反转StringBuilder中的字符串,即x

x = builder.toString();

这会将反转的字符串分配给x

System.out.println(x);

你知道,只需打印反转的字符串。

答案 2 :(得分:0)

j = reversedString.charAt(max);行给出了错误。因为reversedString包含长度为零的空字符串。但是您正在从中访问max索引。

注意:你为反转字符串编写的逻辑是不正确的。下面的代码可能对此有所帮助

for(int i = x.length() - 1; i >=0 ; i--)
{
  char c = x.charAt(i);
  reversedString = reversedString+c;
}

答案 3 :(得分:-1)

reversedString的初始长度为1,因此其初始最大有效索引将为0.对于长度大于0的任何字符串x(任何非空字符串)max = x.length()将在第一次迭代中导致StringIndexOutOfBoundsException。