Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
回文java程序的数组索引越界异常_Java_Arrays_Indexoutofboundsexception_Palindrome - Fatal编程技术网

回文java程序的数组索引越界异常

回文java程序的数组索引越界异常,java,arrays,indexoutofboundsexception,palindrome,Java,Arrays,Indexoutofboundsexception,Palindrome,为什么要获取异常的数组边界?我是编程初学者。请帮我理解。我尝试将字符串转换为字符数组,反转字符,将最终结果转换回字符串,并与原始字符串进行比较 /* to check if the entered string is palinrome or not*/ class Palin { public static void main(String[] args) { String name="anna"; int l=name.length(); int d=l/2; char tmp; char

为什么要获取异常的数组边界?我是编程初学者。请帮我理解。我尝试将字符串转换为字符数组,反转字符,将最终结果转换回字符串,并与原始字符串进行比较

/* to check if the entered string is palinrome or not*/
class Palin
{
public static void main(String[] args)
{
String name="anna";
int l=name.length();
int d=l/2;
char tmp;
char tmp1;
char[] arr = name.toCharArray();

for(int j=0;j<d;j++)  /*to swap the characters*/
{
tmp=arr[j];
tmp1=arr[l];
arr[j]=tmp1;
arr[l]=tmp;
l=l-1;
}

String str=String.valueOf(arr); /* to convert the swapped char array back to string*/
if (str==name)
System.out.println("True");
else
System.out.println("False");

}
}
/*检查输入的字符串是否为palinrome*/
佩林班
{
公共静态void main(字符串[]args)
{
String name=“anna”;
int l=name.length();
int d=1/2;
char-tmp;
字符tmp1;
char[]arr=name.toCharArray();

对于(int j=0;j而言,获得异常的原因是您最初将l=设置为name.length()。当您访问位于l的字符数组时,它超出了范围,因为数组将包含0-name.length()-1。您需要将l初始化为l=name.length()-1;也不要使用==来比较字符串do str.equals(name)

publicstaticvoidmain(字符串[]args)
{
String name=“anna”;
**int l=name.length()**
int d=1/2;
char-tmp;
字符tmp1;
char[]arr=name.toCharArray();

对于(int j=0;j可以使用
0
N-1
之间的索引访问
N
条目数组

更改此项:

tmp1 = arr[l];
tmp = arr[j];
tmp1 = arr[l];
arr[j] = tmp1;
arr[l] = tmp;
l = l-1;
为此:

tmp1 = arr[l-j-1];
tmp = arr[j];
arr[j] = arr[l-j-1];
arr[l-j-1] = tmp;
并且摆脱这个:

l = l-1;

顺便说一下,交换可以在3个赋值操作中完成,而不是在4个赋值操作中完成。

因此,您不妨更改以下内容:

tmp1 = arr[l];
tmp = arr[j];
tmp1 = arr[l];
arr[j] = tmp1;
arr[l] = tmp;
l = l-1;
为此:

tmp1 = arr[l-j-1];
tmp = arr[j];
arr[j] = arr[l-j-1];
arr[l-j-1] = tmp;

brsp05是正确的,您的例外是使用
name.length()
作为最后一个索引

要首先避免此类错误,您可以在此处避免使用数组,而是使用
StringBuilder
类。它提供了一种反转字符串的方法:

String name = "anna";
String str = new StringBuilder(name).reverse().toString();

if (str.equals(name))
  System.out.println("True");
else
  System.out.println("False");

使用此方法可避免大量不必要且容易出错的代码。

int l=name.length();这将存储字符串“anna”的长度这将是4。因此,l=l-1的部分将有3个,并在每个循环上逐个减少。这是我的理解。你能帮我修复它吗?它只会在你尝试访问不存在的arr[4]之后减少。arr[0-3]是有效的索引,你在访问arr[4]之前不会执行l=l-1。这是问题所在,但不是代码的唯一问题。请确保将str==name更改为str.equals(name)。