You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取用户手机号时代码持续抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:01:32