2015-07-13 127 views
2

我想弄清楚「什麼5位數字乘以4時,它會反向嗎?」使用此代碼,但我得到錯誤:線程「主」java.lang.StringIndexOutOfBoundsException異常:字符串索引超出範圍:5 在java.lang.String.charAt(String.java:658) 在Digits.main(數字的.java:12)Java charAt()字符串索引超出範圍:5

public class Digits{ 
    public static void main(String[] args) { 
    int n = 0; 
    int b = 0; 
    String number = Integer.toString(n); 
    String backwards = Integer.toString(b); 

for (int x = 9999; x < 100000 ; x++) { 
    n = x; 
    b = x *4; 

    if (number.charAt(0) == backwards.charAt(5)&& number.charAt(1) == backwards.charAt(4) 
    && number.charAt(2) == backwards.charAt(3) && number.charAt(3) == backwards.charAt(2) 
    && number.charAt(4) == backwards.charAt(1) && number.charAt(5) == backwards.charAt(0)) { 
    System.out.println(n); 
    break; 
    } 
} 

理解

回答

4

正確。由於前五個字符位於索引0, 1, 2, 34。我會使用StringBuilder(因爲StringBuilder.reverse())。而且,我建議你限制可變的可見性。請記得在更改n和/或b時修改numberbackwards。像

for (int x = 9999; x < 100000; x++) { 
    int n = x; 
    int b = x * 4; 
    String number = Integer.toString(n); 
    String backwards = Integer.toString(b); 
    StringBuilder sb = new StringBuilder(number); 
    sb.reverse(); 
    if (sb.toString().equals(backwards)) { 
     System.out.printf("%s * 4 = %s", number, backwards); 
    } 
} 

我也得到

21978 * 4 = 87912 
+0

你對我來說太快了,弗裏施! –

0

backwardsnumber和是String,其內部使用的陣列任何幫助將是grealy。並且數組從0到1的索引。因此,這樣的語句會拋出ArrayIndexOutOfBoundsException異常:

backwards.charAt(5) 
number.charAt(5) 
+1

你的觀察是正確的,但這樣的東西並不在他的代碼中的問題提供幫助。 –

0

在您創建的字符串時,無論你整數都是0,所以你的字符串均爲「0」爲你的程序的時間。你真正想要的是每當你的號碼改變時改變的字符串。所以,你的代碼應該看起來更像是這樣的:

public class Digits{ 
    public static void main(String[] args) { 
    int n = 0; 
    int b = 0; 
    String number; 
    String backwards; 

for (int x = 10000; x < 100000 ; x++) { 
    n = x; 
    b = x *4; 

    number = Integer.toString(n); 
    backwards = Integer.toString(b) 

    . . . 
} 

此外,Java數組是零索引,所以例如字符串「10000」,你的程序將拋出的索引越界異常對backwards.charAt(5)因爲字符串從字符0索引到字符4.

相關問題