繁体   English   中英

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

[英]java String - String index out of range , charAt

我尝试制作一个可以找到回文数的程序(它必须是两个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

这里有两个问题:

  • 正如其他答案所提到的,您从错误的上限开始
  • 如果c从奇数开始,而d从偶数开始,则c 永远不会等于d 您需要使用

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

此外,明智地使用breakreturn将避免您完全拥有podminka

另外 ,您还有一个关注点分离问题。 您的方法当前执行三件事:

  • 以特定方式遍历数字
  • 检查他们是否患有腺癌
  • 打印找到的第一个

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

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通常也会采用一些参数。 在这一点上,您将拥有一些在编写和测试方面都比较容易的方法。

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

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

更新podminka ,您将podminka设置为true

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

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

int d = s.length();

字符串chars的数组只能从0-length-1开始。

s.charAt(d)在第一次迭代中将始终超出范围。

看一下JDK源代码:

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

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

       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开始!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM