код, приведенный ниже, взят из задания в моем учебнике для простой программы, которая берет введенное пользователем имя и заглавная буква имени и фамилии.Код работает правильно, но я не понимаю, почему name.substring()
работает правильно.В частности, меня интересует, как работает блок из строк 24 - 29.Если пользователь вводит имя «Джонни Джонсон», то i
должно содержать значение 7, входящее в строку 29. Если i
содержит 7, то name = name.substring(0, i)
не должно содержать «Джонни J», что должно составлять строку 29на самом деле хранить "Джонни Джонсона" в String name
?Но вместо этого он хранит «Джонни Джонсон», как и должно быть.
Мой второй вопрос связан с тем, что я возился с этим кодом, чтобы увидеть разные результаты.Если я изменяю первую часть строки 29 на name = name.substring(0, i-1)
, я получаю сообщение об ошибке (используя Eclipse):
Исключение в потоке "main" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 15на java.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 }