2011-03-06 59 views
0

任何人都可以幫助我嗎?我不明白這一點例外:Java編程異常

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9 
    at java.lang.String.charAt(Unknown Source) 
    at charPerLine.main(charPerLine.java:13) 

這裏的負責代碼:

import java.util.*; 
public class charPerLine { 

    public static void main(String[] args)throws StringIndexOutOfBoundsException { 
     Scanner sc=new Scanner(System.in); 
     System.out.print("Type any name:"); 
     String s=sc.next(); 
     int j= s.length()+1; 
     for(int i=0;i<=j;i++){ 
      System.out.println(s.charAt(i)); 
     } 
    } 
} 
+3

您正在訪問的字符串長度超過您的字符串長度。你需要發佈一些代碼讓我們理解爲什麼。 – 2011-03-06 08:51:02

回答

3

你引用第9位字符,這是實際的字符串的範圍之外。請記住檢查它是否在[0,長度[。

10

您試圖直接訪問少於10個字符的字符串的第10個字符。喜歡的東西:

"12345".charAt(9) 

記住字符串指數從0開始,因此.charAt(9) => 10字符。所以"123".charAt(3)也會拋出。

+0

非常真實,常見的原因是這樣的循環'for(i = 0; i <= length; i ++)'''''會導致該錯誤.. – 2011-03-06 09:00:12

+4

這就是爲什麼我們有for(char c:「123」)。 toCharArray()){...}':) – 2011-03-06 09:12:49

1

循環應該是:

for(int i=0; i < s.length(); i++){ 
    System.out.println(s.charAt(i)); 
} 

字符串中的最後一個字符的索引:

s.length() - 1

所以你需要使用保護:

i < s.length()

這樣你的循環終止在i變成s.length()之前。

2

js.length()+1然後i<=j。因此:s.charAt(i)最終將訪問索引length()+1,這比允許的數量多2。

1

表達

s.charAt(i) 

將拋出一個錯誤,如果是i大於或小於s.length()相等。嘗試使用

for (int i=0; i<s.length(); i++) 
    // ... 

改爲。

3

啊。感謝Greg發現了這個問題另一半的鏈接。他是對的,這是不公平的。

您的for循環從0到任何長度的s加1。

所以如果s是一個數組:

['a','b','c'] 

然後,它會去從0到4該數組的索引0,1和2。所以,你試圖訪問兩點以後結束。

你想刪除這一行:

int j= s.length()+1; 

並改變for循環:

​​
0

只是

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

代之以

int j= s.length(); 
for(int i=0;i<j;i++){ 
... 
} 

:)