package banking;
public class Account {
protected double balance;
public Account(double balance) {
super();
this.balance = balance;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public boolean deposit(double amt) {
balance+=amt;
return true;
}
public boolean withdraw(double amt) {
if(amt<=balance) {
balance -= amt;
}else {
return false;
}
return true;
}
}
package banking;
public class SavingAccount extends Account {
private double interestRate;
public SavingAccount(double balance, double interestRate) {
super(balance);
this.interestRate = interestRate;
}
public double getInterestRate() {
return interestRate;
}
}
package banking;
public class CheckingAccount extends Account {
private double overdraftProtection;
public CheckingAccount(double balance) {
super(balance);
}
public CheckingAccount(double balance, double overdraftProtection) {
super(balance);
this.overdraftProtection = overdraftProtection;
}
public boolean withdraw(double amt) {
if(amt<=balance) {
balance -= amt;
return true;
}else {
if(overdraftProtection>= amt - balance) {
overdraftProtection -= amt - balance;
balance = 0;
}else {
return false;
}
}
return true;
}
}
package banking;
public class Customer {
private String lastName;
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
private String firstName;
Account[] accounts;
int numberOfAccounts;
public Customer(String L,String F) {
lastName = L;
firstName =F;
}
public Customer() {
accounts = new Account[2];
}
public void addAccount(Account account) {
accounts[numberOfAccounts++]=account;
}
public Account getAccounts(int index) {
return accounts [index];
}
public int getNumberOfAccounts() {
return numberOfAccounts;
}
}
package banking;
public class Bank {
private Customer[] customers;
private int numberOfCustomers;
public Bank() {
customers = new Customer[5];
}
public Customer getCustomers(int index) {
return customers[index];
}
public int getNumberOfCustomers() {
return numberOfCustomers;
}
public void addCustomer(String L,String F) {
Customer customer = new Customer(L,F);
customers[numberOfCustomers]=customer;
numberOfCustomers++;
}
}
package banking;
public class TestBanking {
public static void main(String[] args) {
Bank bank = new Bank();
Customer customer;
bank.addCustomer("Jane", "Smith");
customer = bank.getCustomers(0);
customer.addAccount(new SavingAccount(500,0.05));
customer.addAccount(new CheckingAccount(200,400));
bank.addCustomer("oven", "Bryant");
customer = bank.getCustomers(1);
customer.addAccount(new CheckingAccount(200));
bank.addCustomer("Tim", "Soley");
customer=bank.getCustomers(2);
customer.addAccount(new SavingAccount(1500,0.05));
customer.addAccount(new CheckingAccount(200));
bank.addCustomer("Maria", "Soley");
customer = bank.getCustomers(3);
customer.addAccount(bank.getCustomers(2).getAccounts(1));
customer.addAccount(new SavingAccount(150,0.05));
for(int i = 0;i<bank.getNumberOfCustomers();i++) {
customer = bank.getCustomers(i);
System.out.println();
System.out.println("Customer "+customer.getLastName()+customer.getFirstName());
}
}
}
错误是Exception in thread "main" java.lang.NullPointerException
at banking.Customer.addAccount(Customer.java:28)
at banking.TestBanking.main(TestBanking.java:13)
不明白哪里错了,刚刚自学JAVA的小萌新,希望能够详细解答,并给出修改方案~
很明显嘛,在你TestBanking的main方法的13行出现了空指针异常。追踪过去应该是在customer.addAccount(new SavingAccount(500,0.05));这里出现的。customer是没有问题的,异常只应该出现在addAccount方法内部。接下来追踪到Customer类的addAccount方法查看。你写的代码如下: accounts[numberOfAccounts++]=account;直接向accounts数组中添加Account对象,问题就出现在这里,很明显了。你的accounts数组并没有初始化就在使用了,肯定会是空指针异常。所以修改方法就是在适当的时候进行初始化,你可以尝试在声明数组的时候就初始化,或者调用构造方法的时候初始化。有帮助的话,望采纳。
报的空指针异常了
Customer.java中
int numberOfAccounts;
这个你在方法中需要自增的话,你要给它设置一个初始值 int numberOfAccounts = 0;
然后如果你以后要设置String类型的呀什么的最好都设置初始值 String str ="";
除非那种 Customer customer;这种直接在后面接受不用直接new的才这样写(最好是这样而已,以后慢慢你也知道了)。
其次告诉你看bug的方法
错误是Exception in thread "main" java.lang.NullPointerException
at banking.Customer.addAccount(Customer.java:28)
at banking.TestBanking.main(TestBanking.java:13)
第一句是错误信息 报了什么错误
后面两句是报错的位置,知道了位置看下写的具体是什么,然后找哪句导致的空指针异常
Customer.java 28行
accounts[numberOfAccounts++]=account;
这句 那就看下 numberOfAccounts 和 account具体怎么定义的 就可以找到问题所在
抛出的是空指针异常,出错的是TestBanking类中的customer.addAccount(new SavingAccount(500,0.05));这句话,这句话调用的是Customer类中的addAccount方法,因为TestBanking类中的customer = bank.getCustomers(0);中的customer是通过bank.getCustomers(0);得来的,并不是Custmer中new出来的,所以程序不会走构造函数,所以不会创建accounts = new Account[2];所以是accounts抛出的空指针异常,
解决方法:
Customer中的Account[] accounts;改为Account[] accounts= new Account[2];就可以
这里还是讲一下如何分析错误日志吧,不然你也是一脸懵逼,
首先是错误类型:Exception in thread "main" java.lang.NullPointerException 一般接在Exception关键字之后,你这里出现的是常见的所谓的空指针
异常,空指针详细的信息你可以自行百度,一般而言出现空指针就意味着你对一个为空的变量进行了操作
然后你就看下一行
at banking.Customer.addAccount(Customer.java:28)
很明显了在Customer类的第28行
具体的楼上他们说的很详细了
这里其实是一个经常会出现的问题,空指针异常;在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException)。空指针异常绝对是Java中最难查找和调试的一种异常,你永远无法得到任何有用的调试信息。排错时,我们一般先看第一行,看看报的是什么错误,然后再去寻找报错的位置,这样才能定位到错误的原因。Customer类的第28行报错,首先看到你的int numberOfAccounts;并未初始化,但是后面有numberOfAccounts++操作。