java String - 字符串索引超出范围,charAt

时间:2012-07-25 16:33:12

标签: java string numbers char range

我尝试制作一个可以找到回文编号的程序(它必须是两个3位数字的产品,我希望它包含6位数,但这并不重要)。这是我的代码:

public class palindromicNumber {
    public static void getPalindromicNumber() {
        boolean podminka = false;
        int test;
        String s;
        for (int a = 999; podminka == false && a > 100; a--) {
            for (int b = 999; podminka == false && b > 100; b--) {
                test = a * b;
                s = Integer.toString(test);
                int c = 0;
                int d = s.length();
                while (c != d && podminka == false) {

                    if (s.charAt(c) == s.charAt(d)) { // I think that problem is here but I can't see what
                        System.out.println(s);
                        podminka = true;
                    }
                    c++;
                    d--;
                }
            }
        }
    }
}

如果我想编译它:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:695)
at faktorizace.palindromicNumber.getPalindromicNumber(palindromicNumber.java:24)
at faktorizace.Faktorizace.main(Faktorizace.java:19)

Java结果:1

5 个答案:

答案 0 :(得分:2)

这里有两个问题:

  • 正如其他答案所提及的那样,你开始时错误的上限
  • 如果c从奇数开始,d开始关闭,则c 永远不会等于d。你需要使用

    while (c < d && !podminka) // Prefer !x to x == false
    

此外,明智地使用breakreturn可以避免您必须拥有podminka

除了另一个之外,你有一个关注点分离的问题。您的方法目前有三件事:

  • 以特定方式迭代数字
  • 检查他们是否是palandromic
  • 打印找到的第一个

你应该将它们分开。例如:

public void printFirstPalindrome() {
    long palindrome = findFirstPalindrome();
    System.out.println(palindrome);
}

public long findFirstPalindrome() {
    // Looping here, calling isPalindrome
}

public boolean isPalindrome(long value) {
    // Just checking here
}

我怀疑findFirstPalindrome通常也会采用一些参数。在这一点上,您将拥有在编写和测试时更容易的方法。

答案 1 :(得分:1)

字符串索引来自[0..length - 1]

int d = s.length();更改为int d = s.length() - 1;

更新:暂时不在,

时将podminka设置为true

s.charAt(c) == s.charAt(d)

例如,如果s = 100101,则会在while循环的第一次迭代中终止所有循环,因为第一个和最后一个字符是相同的。

答案 2 :(得分:0)

int d = s.length();

字符串字符数组只会从0 - length-1开始。

s.charAt(d)在第一次迭代时总是不受限制。

答案 3 :(得分:0)

查看JDK源代码:

public char charAt(int index) {
    if ((index < 0) || (index >= count)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index + offset];
}

您可以看到,当index小于零或超过字符串长度时,抛出此异常。现在使用调试器,调试代码,看看为什么将这个错误的参数值传递给charAt()

答案 4 :(得分:0)

       public class palindromicNumber {
           public static void getPalindromicNumber(){
              boolean podminka = false;
               int test;
               String s;
            for(int a = 999;podminka == false && a>100; a-- ){
              for(int b = 999;podminka == false && b>100; b-- ){
                test = a*b;
                s = Integer.toString(test); 
                int c = 0;
                int d = s.length();
                while(c!=d && podminka == false){                          

                  if(s.charAt(c)==s.charAt(d - 1)){  
                    System.out.println(s);
                      podminka = true;                                
                }
                      c++;
                       d--;
                 }
                  } 

}

试试这个!字符串计数从0开始!