
本文详解如何安全、稳定地通过 scanner 向自定义对象(如 bank)数组中逐个赋值,重点解决因输入缓冲区残留导致的 inputmismatchexception 和未初始化对象引发的 nullpointerexception。
本文详解如何安全、稳定地通过 scanner 向自定义对象(如 bank)数组中逐个赋值,重点解决因输入缓冲区残留导致的 inputmismatchexception 和未初始化对象引发的 nullpointerexception。
在 Java 中,使用 Scanner 向自定义对象数组(如 Bank[])批量录入数据是常见需求,但极易因输入流缓冲区处理不当和对象未显式实例化而触发运行时异常——尤其是 NullPointerException(第 17–18 行访问未初始化的 banks[i])和 InputMismatchException(nextInt()/next() 留下换行符,导致后续 nextLine() 读取空字符串)。下面给出规范、健壮的实现方案。
✅ 正确做法:分步清理缓冲区 + 显式构造对象
核心原则有二:
-
每次调用
nextInt()、nextDouble()等非nextLine()方法后,必须手动调用scanner.nextLine()消耗残留的换行符(\n); -
数组仅分配引用空间,每个元素需显式
new Bank(...)初始化,不可直接调用banks[i].setXxx(...)。
以下是修正后的主逻辑(含完整上下文):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter 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()/next(),后续若需读取整行(尤其含空格的字符串),必须先调一次nextLine()清除缓冲区中的\n。 -
永远不要假设数组元素已初始化:
Bank[] banks = new Bank[n]仅创建了n个null引用,必须对每个banks[i]执行new Bank(...)。 -
防御性编程:在工具方法中增加
null检查(如if (b != null && ...)),避免遍历时意外崩溃。 -
资源释放:使用完
Scanner后调用sc.close(),防止资源泄漏(尤其在长期运行程序中)。 -
输入验证(进阶):生产代码中建议加入
hasNextInt()等前置校验,避免InputMismatchException。
遵循以上规范,即可彻底规避 NullPointerException 与 InputMismatchException,实现稳定、可维护的对象数组批量录入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










