下面的代碼來自於我的教科書中的一個賦值,用於輸入用戶輸入名稱並大寫首字母和姓的第一個字母的簡單程序。該代碼正常工作,但我不明白爲什麼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