2011-03-06 60 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++){ 
... 
} 

:)