2016-03-05 106 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前仔细阅读)

相关问题