gpt4 book ai didi

java - 帮助了解 String.substring(int, int) 的工作原理

转载 作者:行者123 更新时间:2023-12-02 09:07:34 24 4
gpt4 key购买 nike

下面的代码来 self 教科书中的一个简单程序的作业,该程序接受用户输入的姓名并将名字和姓氏的第一个字母大写。该代码工作正常,但我不明白为什么 name.substring() 工作正常。具体来说,我对第 24 - 29 行的 block 如何工作感兴趣。如果用户输入名称“Johnny Johnson”,则 i 应包含进入第 29 行的值 7。如果 i 确实包含 7,则不应 name = name.substring(0, i) 包含“Johnny J”,这应该使第 29 行实际上在 String name 中存储“Johnny JJohnson”?但它实际上按其应有的方式存储了“Johnny Johnson”。

我的第二个问题来自于修改这段代码以查看不同的结果。如果我将第 29 行的第一部分更改为 name = name.substring(0, i-1) 我会收到错误(使用 Eclipse):

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 15 at java.lang.String.charAt(String.java:558) at 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 }

最佳答案

来自String.subString(int, int) javadoc:

public String substring(int beginIndex, int endIndex)

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.

链接如下:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#substring(int ,整数)

如果有疑问请查看 javadocs :D

至于你的第二个问题,charAt(int) 的 javadocs ( http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#charAt(int ) ) 再次帮助你:

Throws: IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.

如果您在子字符串中使用 i-1,则每次找到 ' ' 时,名称的大小都会减少 1。这意味着它将迭代 15 次,但在找到 ' ' 后,name 的长度仅为 14 个字符。

关于java - 帮助了解 String.substring(int, int) 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com