簡體   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