2014-03-28 45 views
1

我很新編程。你能告訴我爲什麼這個輸出:迴文編程輸出超出範圍

串索引超出範圍:-1

class Palindrome { 

    public static String reverse(String s) { 
     if (s == "") { 
      return s; 
     } 
     else { 
      return reverse(s.substring(1,s.length())) + s.charAt(0); 
     } 
    } 

    public static void main(String args[]) { 
     System.out.print(reverse("galskjdf")); 
    } 
} 
+0

@ZouZou有這個代碼不字符串比較,只有子,我沒有看到這個問題是如何適用 –

+1

@荒誕,心靈如何'如果(S = =「」)'? –

+0

大聲笑,沒有一天沒有這個副本:-)我幾乎不知道Java,但它似乎對我來說是一個設計缺陷,但我明白爲什麼這是不正常的,所以許多人都落在這個。 –

回答

1

使用

class Palindrome { 
    public static String reverse(String s) { 
    if ("".equals(s)) { 
     return s; 
    } else { 
     return reverse(s.substring(1,s.length())) + s.charAt(0); 
    } 
} 

    public static void main(String args[]) { 
    System.out.print(reverse("galskjdf")); 
    } 
} 

How do I compare strings in Java?Reverse a string in Java mig ht也是有幫助的(儘管你可能做了上面的代碼作爲編程練習,但知道通常人們會使用已有的工具來處理這種事情並沒有什麼壞處)。

之所以使用

"".equals(s) 

,而不是

s.equals("") 

如下:如果snull,後者將拋出一個NullPointerException(因爲你試圖調用一個方法上null ),而前者仍然可以在您調用「適當」字符串的方法時使用,另請參閱Gracefully avoiding NullPointerException in Java但是,我還記得有些人批評這種方法,因爲這可能會使您事實上snull當它不應該(在這種情況下,你應該明確檢查句柄的情況下)。

+0

'「」.equals(s)'會更好地避免可能的NPE – turbo

+0

不錯謝謝, – user252017

+0

@turbo,謝謝,你說得對,我已經添加了 – godfatherofpolka

1

因爲你是在一個錯誤的方式做字符串比較=>遞歸不會在停有效點。與此

s == "" 

:替換此

"".equals(s) 

編輯嗯,貌似是需要證明的,那就是:http://ideone.com/TWm5U8

+0

雖然這不是不真實的,但這並不回答這個問題;錯誤信息不是來自這個... –

+1

@Bartdude好吧,我試着在給定的代碼更正,它的工作原理;) –

+0

@Bartdude你錯了,證明http:// ideone。com/TWm5U8 – nikis

0

使用此功能:

public static String reverse(String s) { 
    if (s == null || s.length() <= 1) { 
     return s; 
    } else { 
     return reverse(s.substring(1)) + s.charAt(0); 
    } 
}