字符串索引 OutOfBoundsException?
String Index OutOfBoundsException?
我的作业是反转字符串并打印反转后的字符串。
这是我的代码
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 因为一位朋友告诉我这样做,但我一直收到同样的错误。
reversedString
的初始长度为 1,因此其初始最大有效索引将为 0。对于任何长于 0 的字符串 x
(任何非空字符串)max = x.length()
将在第一次迭代中导致 StringIndexOutOfBoundsException。
你的问题出在这里:
String reversedString = " ";
写几行后:
j = reversedString.charAt(max); // while the reversedString.length() == 1
这就是您收到错误的原因。您混淆了输入到 max
(显然是 6)的 x.length()
和始终等于 " " 且长度从不大于 1 的 reversedString。
j = reversedString.charAt(max);
行给你 error.Since reversedString
包含长度为 zero.But 的空字符串,你正在从那里访问 max
索引。
注意:您为反转字符串编写的逻辑不是correct.Below代码可能对此有帮助
for(int i = x.length() - 1; i >=0 ; i--)
{
char c = x.charAt(i);
reversedString = reversedString+c;
}
看起来你正在编写一个程序来反转字符串。但乍一看,我认为你离解决方案还很远。
不过不用担心! 抛出异常的原因是您获取的是字符串“ ”中 max
索引处的字符。字符串“”只有一个字符——aspace。这意味着它只有一个索引 0。如果您尝试访问索引 6 或 7 或 8 或 0 以外的某个值的字符,则会出现异常!
为什么不使用StringBuilder
class中提供的反向方法呢? 非常 好用!将此代码放入您的 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);
你知道的,只是打印反转的字符串。
我的作业是反转字符串并打印反转后的字符串。
这是我的代码
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 因为一位朋友告诉我这样做,但我一直收到同样的错误。
reversedString
的初始长度为 1,因此其初始最大有效索引将为 0。对于任何长于 0 的字符串 x
(任何非空字符串)max = x.length()
将在第一次迭代中导致 StringIndexOutOfBoundsException。
你的问题出在这里:
String reversedString = " ";
写几行后:
j = reversedString.charAt(max); // while the reversedString.length() == 1
这就是您收到错误的原因。您混淆了输入到 max
(显然是 6)的 x.length()
和始终等于 " " 且长度从不大于 1 的 reversedString。
j = reversedString.charAt(max);
行给你 error.Since reversedString
包含长度为 zero.But 的空字符串,你正在从那里访问 max
索引。
注意:您为反转字符串编写的逻辑不是correct.Below代码可能对此有帮助
for(int i = x.length() - 1; i >=0 ; i--)
{
char c = x.charAt(i);
reversedString = reversedString+c;
}
看起来你正在编写一个程序来反转字符串。但乍一看,我认为你离解决方案还很远。
不过不用担心! 抛出异常的原因是您获取的是字符串“ ”中 max
索引处的字符。字符串“”只有一个字符——aspace。这意味着它只有一个索引 0。如果您尝试访问索引 6 或 7 或 8 或 0 以外的某个值的字符,则会出现异常!
为什么不使用StringBuilder
class中提供的反向方法呢? 非常 好用!将此代码放入您的 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);
你知道的,只是打印反转的字符串。