如何用Scanner在Java自定义对象数组中存值?代码报错求排查
排查Bank类代码中的NullPointerException和InputMismatchException
一、NullPointerException(第17/18行)的问题分析与修复
问题根源
你大概率只初始化了Bank[]类型的数组,但数组里的每个Bank对象都还是null,直接调用null对象的方法或给它的属性赋值时就会触发空指针异常。比如类似下面的错误写法:
Bank[] accounts = new Bank[5]; // 数组本身初始化了,但每个元素都是null accounts[i].setAccountNumber(scanner.nextInt()); // 这里accounts[i]是null,调用方法直接抛NPE
修复方案
在给数组元素的属性赋值前,必须先实例化每个Bank对象:
Bank[] accounts = new Bank[5]; for(int i=0; i<accounts.length; i++){ accounts[i] = new Bank(); // 先创建Bank实例,再操作属性/方法 accounts[i].setAccountNumber(scanner.nextInt()); }
二、InputMismatchException的问题分析与修复
问题根源
Scanner读取输入时,输入内容的类型和你调用的读取方法预期不匹配:
- 调用
scanner.nextInt()却输入了字符串(比如"abc") - 调用
scanner.nextDouble()却输入了非数字字符 - 输入格式不符合要求(比如要求整数却输入小数)
修复方案
方案1:读取前先校验输入类型
用Scanner的hasNextInt()/hasNextDouble()等方法提前判断,避免异常:
if(scanner.hasNextInt()){ int accNum = scanner.nextInt(); accounts[i].setAccountNumber(accNum); } else { System.out.println("请输入有效的整数账号"); scanner.next(); // 跳过无效输入,防止死循环 }
方案2:捕获异常并处理
通过try-catch捕获异常,同时清理缓冲区的无效输入:
try { accounts[i].setAccountNumber(scanner.nextInt()); } catch(InputMismatchException e){ System.out.println("输入格式错误,请输入整数"); scanner.next(); // 清除无效内容 i--; // 让当前循环重新处理这个位置 }
三、完整可运行示例代码
假设你的Bank类包含账号和余额属性,示例代码如下:
import java.util.Scanner; class Bank { private int accountNumber; private double balance; // Getter & Setter public int getAccountNumber() { return accountNumber; } public void setAccountNumber(int accountNumber) { this.accountNumber = accountNumber; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } } public class BankTest { // 批量存入账号信息 public static void loadAccountNumbers(Bank[] accounts, Scanner scanner) { for(int i=0; i<accounts.length; i++){ accounts[i] = new Bank(); // 必须先实例化对象 System.out.print("请输入第" + (i+1) + "个账号的编号:"); while(!scanner.hasNextInt()){ System.out.println("输入无效,请输入整数!"); scanner.next(); } accounts[i].setAccountNumber(scanner.nextInt()); } } // 批量存入余额信息 public static void loadBalances(Bank[] accounts, Scanner scanner) { for(int i=0; i<accounts.length; i++){ System.out.print("请输入账号" + accounts[i].getAccountNumber() + "的余额:"); while(!scanner.hasNextDouble()){ System.out.println("输入无效,请输入数字!"); scanner.next(); } accounts[i].setBalance(scanner.nextDouble()); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Bank[] accounts = new Bank[3]; loadAccountNumbers(accounts, scanner); loadBalances(accounts, scanner); // 测试输出 for(Bank acc : accounts){ System.out.println("账号:" + acc.getAccountNumber() + ",余额:" + acc.getBalance()); } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

