2016-03-05 368 views
0

我一直在嘗試編寫一個Java程序,它將字符串中每個單詞的第一個字母轉換爲大寫字母。現在它看起來是這樣的:java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:4

package strings; 
import java.util.Scanner; 

public class small_cap { 
    public static void main(String[] args) { 

     Scanner sc = new Scanner(System.in); 
     System.out.println("Enter the sentence"); 
     String st = sc.next(); 
     String str = " " + st; 

     int j = 0; char chr = ' '; 

     for (int i = 0; i < str.length(); i++){ 
      j = i + 1; 
      chr = str.charAt(j); 
      if (chr == ' '){ 
       char a = Character.toUpperCase(str.charAt(j)); 
       str = str.replace(str.charAt(j), a); 
      } 
      else{ 
       char a = Character.toLowerCase(str.charAt(j)); 
       str = str.replace(str.charAt(j), a); 
      } 
     } 
     System.out.println(str); 
    } 
} 

不幸的是我不斷收到錯誤:

java.lang.StringIndexOutOfBoundsException: String index out of range: 4 
    at java.lang.String.charAt(String.java:658) 
    at small_cap.main(small_cap.java:19) 

我實在不明白在代碼的任何故障。有人可以指出我要去哪裏嗎?

+2

似乎很清楚,爲什麼,你會得到一個索引越界異常,看到的時候我是長 - 1,j是長度,這是過去的字符串的結尾。 –

+0

我也會說你的邏輯看起來很不對。這應該是大寫每個單詞的第一個字母在一個句子中? –

+0

@c_dubs這個程序應該把一個句子中每個單詞的第一個字母大寫,其他字母小寫,以防萬一它們中的一些已經大寫。現在我看到了它所走的界限。謝謝! – Satrajit

回答

0
  1. 您使用Scanner.next()而不是Scanner.nextLine(),它將閱讀整個句子而不是單個單詞。
  2. 您正在String中添加額外空間。不知道背後的重大原因。沒有它就可以完成。
  3. 假設輸入是:「abc def」,在添加額外空間後它將變成「abc def」。字符串的長度將變爲:7
  4. 現在for循環將從0迭代到6.但是,在i = 6時,它將嘗試更改第7個位置上的元素(因爲您正在執行j = i + 1),這會導致字符串索引超出範圍錯誤。
  5. 您正在使用String.Replace,它將替換所有匹配的字符,而不考慮它們的位置。

    import java.util.Scanner;

    public class small_cap { 
        public static void main(String[] args) { 
    
         Scanner sc = new Scanner(System.in); 
         System.out.println("Enter the sentence"); 
         String st = sc.nextLine(); 
         String str = " " + st; 
    
         int j = 0; char chr = ' '; 
    
         for (int i = 0; i < str.length()-1; i++){ 
          j = i+1; 
    
          chr = str.charAt(i); 
          if (chr == ' '){ 
           char a = Character.toUpperCase(str.charAt(j)); 
           str = str.substring(0,j)+a+str.substring(j+1); 
          } 
          else{ 
           char a = Character.toLowerCase(str.charAt(j)); 
           str = str.substring(0,j)+a+str.substring(j+1); 
          } 
         } 
         System.out.println(str); 
        } 
    

    }

0
for (int i = 0; i < str.length(); i++){ 
     j = i + 1; 

i當到達最後一有效索引length - 1j將等於length,這是出界。

我並沒有真正看到j變量的起始點 - 你是否想在循環內的其他地方使用i,或者你應該讓循環從1開始?還是你或許意味着做j = i - 1;檢查前一個字符(在這種情況下,要確保你沒有索引0前仔細閱讀)

相關問題