这是我编写的一些代码,用于检查long是否是回文,使用整数数组。我这样做是为了测试我的技能,(失败)所以不要评论更好的方法来检查一个数字是否是回文。
import java.util.Scanner;
public class digextester {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
String in = input.nextLine();
long im = Long.valueOf(in).longValue();
System.out.println(im);
thing(im);
}
public static void thing(long im) {
int l = 0;
while (im > 0) {
im = im / 10;
l++;
}
System.out.println(l);
int arrim[] = new int[l];
for (int c = 1; c <= l; c++) {
arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
im = im / 10;
}
int e = 1;
int d = 0;
while (e < (l / 2)) {
if (arrim[e] == arrim[(l - e) + 1]) {
d = 0;
} else {
d = 20;
e = l;
}
e++;
}
if (d == 0) {
System.out.println("pal");
} else {
System.out.println("not pal");
}
}
}
这是我在线程&#34; main&#34;:
中得到的例外java.lang.ArrayIndexOutOfBoundsException: 5
at digextester.thing(digextester.java:27) - arrim[c] = ((int)(im-(im/10)*10)) ;
at digextester.main(digextester.java:12) - thing(im);
有人可以解释导致此异常的原因吗?
答案 0 :(得分:2)
您的异常是由于数组索引从0到长度-1,而不是从1到长度(即arrim[c]
导致ArrayIndexOutOfBoundsException
时出现c == l
异常。< / p>
此外,我还会从im % 10
中提取长度最低的数字。
答案 1 :(得分:1)
首先,代码中存在逻辑错误。在你的方法
public static void thing(long im)
我建议你加上:
long temp = im;
并在for循环中,更改
arrim[c] = ((int) (im - (im / 10) * 10));
到
arrim[c] = ((int) (temp - (temp / 10) * 10));
如果您不这样做,您输入的每个数字都将显示为回文。
现在是例外。
在代码的这个片段中,
for (int c = 1; c <= l; c++) {
arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
im = im / 10;
}
首先改为
for (int c = 0; c < l; c++)
然后在这部分,
int e = 1;
int d = 0;
while (e < (l / 2)) {
if (arrim[e] == arrim[(l - e) + 1]) {
d = 0;
}
变化
int e = 1
到
int e = 0;
和
if (arrim[e] == arrim[(l - e) + 1])
到
if (arrim[e] == arrim[(l - e) - 1])
然后代码应该正常工作:)
说明:正如其他答案所示,你在for循环中使c = 1而不是c = 0导致异常。
这是因为,例如。如果输入的数字是1111,则变量l = 4的值,因此数组大小为4即。 arrim [0]到arrim [3]。
在你说c = 1到c&lt; = l(这里是4)的for循环中,你试图给arrim [1],arrim [2],... arrim [4]和arrim [赋值] 4]不存在。这会导致异常。
在第二部分你做了
int e = 1
和
if (arrim[e] == arrim[(l - e) + 1])
这会导致异常。
例如,如果输入的数字再次为1111,那么变量l = 4的值。
arrim [0] = 1,arrim [1] = 1,....,arrim [3] = 1.
但在if声明中, arrim [1] == arrim [(4 - 1)+ 1)] ie。 当没有arrim [4]时,正在检查arrim [1] == arrim [4]。 这显然是例外。
答案 2 :(得分:0)
一种替代实施方式: TestPalindrome类
package com.example.palindrome;
import java.util.Scanner;
public class TestPalindrome {
private static TestPalindrome me;
Scanner input;
public static void main(String[] args) {
me = new TestPalindrome();
me.doWork();
}
private void doWork() {
input = new Scanner(System.in);
System.out.println("Enter number or Q to Quit");
String inputValue = input.nextLine();
while (inputValue != "Q") {
long candidate = Long.valueOf(inputValue).longValue();
boolean palindromatic = Palindrome.isPalindrome(candidate);
System.out.println("Number " + candidate + " palindromatic ? "
+ palindromatic);
System.out.println("Enter number or Q to Quit");
inputValue = input.nextLine();
}
}
}
回文类
package com.example.palindrome;
public class Palindrome {
public static boolean isPalindrome(long number) {
long reverse = 0;
long value = number;
while (value > 0 ) {
long nextNumber = value / 10;
long digit = value - nextNumber*10;
reverse = reverse * 10 + digit;
value = nextNumber;
}
return number == reverse;
}
}
答案 3 :(得分:0)
你的阵列&#34; arrim&#34;仅被初始化为1的大小...意味着唯一有效的数组元素的索引为0 ...(arrim [0])。请记住,数组索引从0开始。有关数组的详细信息,请查看此处:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
因此,直接来说,您的例外情况来自以下内容:
你的循环:
for (int c = 1; c <= l; c++) {
arrim[c] = ((int) (im - (im / 10) * 10)); // also tried = im%10
im = im / 10;
}
...首先设置&#34; c&#34;值为1.然后传递终止测试c<=1
并进入循环。
尝试访问arrim[c]
的循环的第一行 - 我们知道arrim[1]
。鉴于我们知道arrim数组只包含一个元素,位于arrim [0]位置,任何访问arrim元素的尝试都不是在索引&#39; 0&#39;将导致ArrayIndexOutOfBoundsException
。
ArrayIndexOutOfBoundsException
是java编程中常见的错误异常,你可以阅读这里的细节:http://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html。异常的长短归结为:您尝试使用无效的数组索引(小于零或大于.length-1)