使用Scanner先读标题再读两个单词触发数组越界异常求助
解决Java中ArrayIndexOutOfBoundsException:1的问题
嘿,这个ArrayIndexOutOfBoundsException: 1我太熟了!本质就是你尝试访问数组的第2个元素(Java数组索引从0开始),但拆分后的数组根本没有这么多元素,大概率是Scanner读取逻辑的坑或者输入格式不符合预期导致的,我给你一步步拆解解决:
错误原因分析
你遇到的报错位置在MainSystem.addBook的第57行,也就是拆分导演输入后想取索引为1的元素时出错。常见的两个诱因:
- Scanner读取方式冲突:如果你先用
next()读取标题(只会读到第一个空格就停止),输入缓冲区里会留下换行符,接下来用nextLine()读取导演信息时,会直接把这个换行符当成空字符串读入,拆分后数组长度为0,自然访问索引1就报错。 - 输入格式不符合要求:用户输入导演信息时只填了一个单词,没有用空格分隔名和姓,拆分后数组长度为1,同样会触发索引越界。
修正后的代码示例
我给你写一段规避这些问题的代码,包含输入校验和正确的Scanner读取逻辑:
import java.util.Scanner; public class MainSystem { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取标题:用nextLine()读完整标题(支持带空格的标题) System.out.print("请输入标题:"); String title = scanner.nextLine(); // 读取导演名和姓氏 System.out.print("请输入导演名和姓氏(空格分隔):"); String directorInput = scanner.nextLine().trim(); // 去掉前后空格 // 用\\s+匹配任意数量的空格(避免多个空格导致拆分出空元素) String[] directorParts = directorInput.split("\\s+"); // 先校验输入格式 if (directorParts.length < 2) { System.out.println("错误:请输入空格分隔的两个单词!"); scanner.close(); return; } // 安全获取导演名和姓氏 String directorFirstName = directorParts[0]; String directorLastName = directorParts[1]; // 后续业务逻辑,比如调用addBook addBook(title, directorFirstName, directorLastName); scanner.close(); } private static void addBook(String title, String directorFirstName, String directorLastName) { // 你的业务代码 System.out.println("添加成功:标题=" + title + ",导演=" + directorFirstName + " " + directorLastName); } }
关键注意事项
- 统一用nextLine()读取:避免
next()和nextLine()混用导致的缓冲区残留问题,这样能读取带空格的完整输入内容。 - 输入校验不可少:在访问数组索引前,先判断数组长度,防止用户输入不符合要求的内容。
- 灵活的拆分规则:用
\\s+作为分隔符,能兼容用户输入多个空格的情况,同时用trim()去掉输入前后的无效空格。
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

