【问题标题】:java String - String index out of range , charAtjava String - 字符串索引超出范围,charAt
【发布时间】:2012-07-25 16:33:11
【问题描述】:

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

【问题讨论】:

    标签: java string numbers char range


    【解决方案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] 但编译器没有给我结果(它什么也没给我:D)你有什么解决方案或想法吗?
    • @user1551954:一次一个问题......这听起来像是一个单独的问题,所以在阅读tinyurl.com/so-hints之后提出一个新问题
    【解决方案2】:

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

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

    更新:顺便说一句,当

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

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

    【讨论】:

    • 当您更改了与此变量相关的“d”更新代码时。例如比较和条件运算符涉及此变量。
    • Ouuu ,这就是我正在寻找的错误。当我知道我必须看哪里时,我很容易弄清楚。 :D
    • @user1551954:如果两个字符不相等,可以设置podminka = true 快速修复。但是,这仍然会终止所有循环。你真的应该看看@Jon Skeet 的回答。
    • 所以我发现了问题(我可以找到回文数)但是现在出现了下一个问题,我找到了朋友。数字,但它不是最大的。我做了 Jon Skeet 给我看的事情,所以问题出在: public long findFirstPalindrome() { // 在这里循环,调用 isPalindrome }
    【解决方案3】:

    int d = s.length();

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

    s.charAt(d) 在第一次迭代时总是会越界。

    【讨论】:

      【解决方案4】:

      看一下JDK源码:

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

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

      【讨论】:

      • 你说超过,不是说达到或超过吗?毕竟 "hello".charAt(5) 没有超过长度,但是因为满足长度而抛出异常。
      【解决方案5】:
             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 开始!

      【讨论】:

      • 你的内循环对 123 这样的数字做了什么?
      • 我试过了,错误消失了,但结果不令人满意(错误:D)。当我开始它时,我得到了这个:990009,但它不是回文数。你有什么解决办法吗?
      • @user1551954:考虑当s = 990009 时算法会发生什么。遵循逻辑。
      • 我认为是正确的。我取第一个字符并与最后一个字符进行比较。然后我拿第二个字符和倒数第二个字符一遍又一遍地比较。当我在中间时,算法停止并返回最终数字。
      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2012-01-15
      • 2014-06-12
      相关资源
      最近更新 更多