下面的代码来自于我的教科书中的一个赋值,用于输入用户输入名称并大写首字母和姓的第一个字母的简单程序。该代码正常工作,但我不明白为什么name.substring()
正常工作。具体来说,我感兴趣的是第24-29行的区块是如何工作的。如果用户输入名称“Johnny Johnson”,则i
应该包含进入第29行的值7。如果i
确实包含7,则不应该包含“Johnny J”,其应该使得第29行实际存储“JohnnyJJohnson”在String name
?但实际上它应该存储“约翰尼约翰逊”。有关String.substring(int,int)如何工作的帮助
我的第二个问题来自这个代码搞乱看到不同的结果。如果我改变线29的第一部分name = name.substring(0, i-1)
我得到(使用Eclipse)的错误:在线程
异常“主” java.lang.StringIndexOutOfBoundsException: 字符串索引超出范围:在java的15 .lang.String.charAt(String.java:558) 在 RepairName.main(RepairName.java:17)
为什么在第17行,而不是第29行出现错误?其实,为什么我会得到一个错误,因为i-1
实际上并没有改变i
的值是否正确?我认为它与循环有关,但由于i
的值没有改变,所以我不知道它为什么会这样。
对不起,这是一个冗长的问题。我对Java很陌生,对编程也很新颖(显然),但是我很欣赏你们所有人都能提供的见解。谢谢!
1 import javax.swing.*;
2
3 public class RepairName
4 {
5 public static void main(String[] args)
6 {
7 String name, saveOriginalName;
8 int stringLength;
9 int i;
10 char c;
11 name = JOptionPane.showInputDialog(null, "Please enter your first and last name");
12
13 saveOriginalName = name;
14 stringLength = name.length();
15 for (i = 0; i < stringLength; i++)
16 {
17 c = name.charAt(i);
18 if (i == 0)
19 {
20 c = Character.toUpperCase(c);
21 name = c + name.substring(1, stringLength);
22 }
23 else
24 if(name.charAt(i) == ' ')
25 {
26 i++;
27 c = name.charAt(i);
28 c = Character.toUpperCase(c);
29 name = name.substring(0, i) + c + name.substring(i+1, stringLength);
30 }
31 }
32 JOptionPane.showMessageDialog(null, "Original name was " + saveOriginalName + "\nRepaired name is " + name);
33 }
34
35 }
非常感谢您的解释!我甚至没有想到循环的第一次迭代......我只是想着最后一个。我有很多东西需要学习。感谢您的链接 – knobcreekman 2011-04-12 21:55:28
小调:我们现在有1.6(但是子串当然没有改变)。 – 2011-04-12 21:56:14
真的,大声笑我刚刚搜索了Java字符串API,并得到了第一击:D – Tnem 2011-04-12 21:57:22