
本文详解如何安全地用 scanner 向 bank 类型对象数组批量录入数据,重点解决因输入缓冲区残留换行符导致的 nullpointerexception 和 inputmismatchexception。
本文详解如何安全地用 scanner 向 bank 类型对象数组批量录入数据,重点解决因输入缓冲区残留换行符导致的 nullpointerexception 和 inputmismatchexception。
在 Java 中,使用 Scanner 向自定义对象数组(如 Bank[])逐个录入数据时,输入流缓冲区中残留的换行符(\n)是引发 NullPointerException 和 InputMismatchException 的根本原因。原代码中混合调用 nextInt()、next() 与 nextLine(),而 nextInt() 不会消费其后的换行符,导致后续 nextLine() 立即读取空字符串,进而使 Bank 构造时传入 null 或非法值;若未对数组元素显式初始化就调用其方法(如 b.getCity()),则触发 NullPointerException。
✅ 正确做法:统一管理输入缓冲区
关键原则是:每次调用 nextInt()、nextDouble() 等非 nextLine() 方法后,立即用 scanner.nextLine() 消费掉残留的换行符。以下是修正后的核心逻辑(含完整可运行结构):
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of banks: ");
int tasks = sc.nextInt();
sc.nextLine(); // ✅ 消费nextInt()留下的换行符
Bank[] banks = new Bank[tasks];
for (int i = 0; i <h3>⚠️ 关键注意事项总结:</h3>
-
nextLine()是“清道夫”:它必须紧跟在nextInt()/nextDouble()后调用,否则下一次nextLine()会读到空行; -
避免
next()读取带空格字符串:如银行名含空格(如"State Bank of India"),sc.next()只读"State",应改用sc.nextLine(); -
空指针防御不可少:遍历数组前检查
b != null,方法入参也建议判空(如city != null); -
资源及时释放:
Scanner使用完毕后调用sc.close(),防止资源泄漏; -
边界处理要严谨:当无匹配银行时,
findAvg...应返回0.0而非除零异常,getBank...返回null更符合语义。
遵循以上规范,即可稳定、健壮地完成自定义对象数组的交互式数据录入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










