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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:22:44