Exception in thread “main“ java.lang.NullPointerException问题的解决

本文详细分析了Java程序中出现空指针异常的原因,即属性未初始化,特别是对象数组。并提供了两种解决方法:在属性声明时初始化或在构造器中初始化。通过示例代码展示了如何避免空指针异常,并解释了初始化的重要性。最后,通过一个Bank类的实例展示了如何正确添加和访问客户信息,以及避免空指针异常的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exception in thread “main” java.lang.NullPointerException
java程序的空指针异常
在这里插入图片描述
错误原因:
属性未初始化,更具体点就是类里面属性之一的对象数组未进行初始化

解决方法

1.在属性声明的时候就进行显式的初始化赋值
2.在构造器中进行属性的初始化赋值

方法1如下所示:
在这里插入图片描述
方法2如下所示:
在这里插入图片描述

最后来深入解析一下:
如果在main()代码里我们创建一个Bank类的对象bank(假设现在属性只是声明而未进行初始化赋值):

Bank bank = new Bank();

如下所示,在堆中开辟一个空间存放bank对象的属性并将地址给bank。但此时属性值是默认值,如图所示,对象数组customers默认值为null,执行bank.addCustomer(String f, String l)方法必然会出现空指针异常。
在这里插入图片描述
而进行如上述所说的属性初始化操作之后,如下所示:
在这里插入图片描述
调用addCustomer(String f, String l)方法:

bank.addCustomer("Jane", "Smith");

在这里插入图片描述
最后贴上代码:(Bank.java和BankTest.java)

// Bank.java
package com.atguigu.exer4;

public class Bank
{
	// private Customer[] customers = new Customer[100];
	private Customer[] customers;// 存放多个客户的数组
	private int numberOfCustomers;// 记录客户的个数

	public Bank()
	{
		customers = new Customer[100];// 加上这句话,若不加上只是声明而非初始化
	}

	// 添加客户
	public void addCustomer(String f, String l)
	{
		customers[numberOfCustomers++] = new Customer(f, l);
		// 或者分开写,如下所示
		// Customer cust = new Customer(f, l);
		// customers[numberOfCustomers++] = cust;
	}

	// 获取客户的个数
	public int getNumOfCustomers()
	{
		return this.numberOfCustomers;
	}

	// 获取指定位置上的客户
	public Customer getCustomer(int index)
	{
		// return customers[index];//可能报异常
		if (index >= 0 && index < numberOfCustomers)
		{
			return customers[index];
		}

		return null;
	}
}

// BankTest.java
package com.atguigu.exer4;

public class BankTest
{
	public static void main(String[] args)
	{
		Bank bank = new Bank();
		
		bank.addCustomer("Jane", "Smith");//0
		bank.addCustomer("Sam", "Fisher");//1
		bank.addCustomer("Bayek", "Siwa");//2
		bank.addCustomer("Cayde", "6");//3
		
		int num = bank.getNumOfCustomers();
		System.out.println("银行客户一共有" + num + "个人!");
		
		Account acct = new Account(1000);
		
		bank.getCustomer(1).setAccount(acct);
		
		bank.getCustomer(1).getAccount().deposit(1000);
		
		bank.getCustomer(1).getAccount().withdraw(500);
		
		bank.getCustomer(1).getAccount().withdraw(2000);
		
		double balance = bank.getCustomer(1).getAccount().getBalance();
		
		System.out.println("余额还有:" + balance);
		
		System.out.println("Customer [" + bank.getCustomer(1).getFirstName() + 
				", " + bank.getCustomer(1).getLastName() + "]" +  " balance is "
				+ balance);
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值