获取用户手机号时代码持续抛出StringIndexOutOfBoundsException异常求助
问题分析与解决方案
你遇到的StringIndexOutOfBoundsException核心原因是类成员变量phone始终是空字符串"",当getPhone()方法尝试调用charAt(0)到charAt(9)时,自然会因为字符串长度不足抛出越界异常。我们来一步步拆解问题并修复:
1. 核心错误:局部变量覆盖了成员变量
在setPhone()方法里,你定义了一个局部变量String phone = input.nextLine();,后续所有操作都是针对这个局部变量,完全没有给类的成员变量this.phone赋值。也就是说,类里的phone还是初始的空字符串"",这直接导致getPhone()调用时触发异常。
2. 手机号处理逻辑完全错误
- 循环
for(int i=0; i<1; i++)只执行一次,只能检查第一个字符,根本无法统计10位数字。 phone = phone.concat(ss);的操作毫无意义,相当于把第一个数字重复拼到原字符串后面,完全达不到提取数字或验证长度的目的。
修复后的代码
我们重新编写setPhone()方法,同时优化getPhone()的安全性:
import java.util.Scanner; public class Event { public static double pricePerGuestHigh = 35.00; public static double pricePerGuestLow = 32.00; public static final int LARGE_EVENT_MAX = 50; public String phone = ""; public String eventNumber; private int guests; private double pricePerEvent; public void setPhone() { Scanner input = new Scanner(System.in); System.out.println("Enter your phone number: "); // 读取输入的手机号 String inputPhone = input.nextLine(); // 提取输入中的所有数字 StringBuilder digitsOnly = new StringBuilder(); for (char c : inputPhone.toCharArray()) { if (Character.isDigit(c)) { digitsOnly.append(c); } } // 验证数字长度是否为10位,否则设置默认值 if (digitsOnly.length() == 10) { this.phone = digitsOnly.toString(); } else { this.phone = "0000000000"; } } public String getPhone() { // 先确保phone长度是10位,避免越界 if (this.phone == null || this.phone.length() != 10) { return "(000)000-0000"; } // 格式化手机号为(XXX)XXX-XXXX的常见格式 return String.format("(%s)%s-%s", phone.substring(0,3), phone.substring(3,6), phone.substring(6)); } // 其他方法优化与保留 public void setEventNumber() { Scanner input = new Scanner(System.in); System.out.println("Enter the event number: "); eventNumber = input.nextLine(); } public void setGuests(int guests) { this.guests=guests; pricePerEvent = isLargeEvent() ? pricePerGuestHigh : pricePerGuestLow; } public int getGuestsCount() { return guests; } public boolean isLargeEvent() { return guests >= LARGE_EVENT_MAX; // 简化冗余逻辑,去掉不必要的递归 } public String getEventNumber() { return "Event Number: " + this.eventNumber; } public int getGuests(boolean largeEvent) { return guests; } }
修复说明
- 修正成员变量赋值:使用
this.phone明确赋值类成员变量,彻底避免局部变量覆盖的问题。 - 正确提取数字:遍历输入字符串的所有字符,只保留有效数字,确保手机号的数字有效性。
- 安全格式化手机号:在
getPhone()里先检查phone的有效性,用String.format()更简洁地格式化手机号,同时避免手动charAt的越界风险。 - 简化冗余逻辑:把
isLargeEvent()的递归和多余分支去掉,直接返回判断结果,让代码更简洁。
这样修改后,不仅解决了StringIndexOutOfBoundsException的问题,还让手机号的处理逻辑更健壮、易维护。
内容的提问来源于stack exchange,提问作者Hoeins
相关产品推荐
相关产品推荐

