[英]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
此外,明智地使用break
和return
將避免您完全擁有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.