如何避免空属性?

齐夫·凯斯滕

我正在练习建立银行系统,创建帐户类,客户类和银行类的练习,但是当我检查程序时会得到:

Exception in thread "main" java.lang.NullPointerException.

这是我的课程:

package bank.elements;

public class Account {

    private int id;
    private float balance;

    //constructors
    public Account(int id, float balance){
        this.setId(id);
        this.setBalance(balance);
    }

    public Account (int id){
        this.id=id;
        this.setBalance(0);
    }


    //getters
    public int getId(){
        return this.id;

    }

    public float getBalance(){
        return this.balance;
    }


    //setters
    public void setBalance(float balance){
        this.balance+=balance;
    }

    public void setId(int id){
        this.id=id;
    }

}



package bank.elements;

public class Client {

    private int id;
    private String name;
    private String rank;
    private float balance;
    private Account[] accounts = new Account[100];

    public Client(){

    }

    //getters
    public int getId(){
        return id;
    }

    public String getName(){
        return name;
    }

    public String getRank(){
        return rank;
    }

    public float getBalance(){
        return balance;
    }

    public float getAccountBalance(int id){

        float balance = 0;
        for (int i = 0; i < accounts.length; i++) {
            if(accounts[i].getId()==id){
                balance = accounts[i].getBalance();
            }
        }
        return balance;
    }

    public float getFortune(){
        float sum = 0;
        for (int i = 0; i < accounts.length; i++) {
            sum+=getAccountBalance(i);
        }
        sum+=getBalance();
        return sum;
    }

    //setters
    public void setName(String name){
        this.name = name;
    }

    public void setBalance(float balance){
        this.balance+=balance;
    }

    public void setId(int id){
        this.id=id;
    }

    public void addAccount(int id){
        for (int i = 0; i < accounts.length; i++) {
            if(accounts[i]==null){
                accounts[i].setId(id);
            }
        }
    }

}



package bank.elements;

public class Bank {

    public Bank(){

    }

    public Client[] clients = new Client[100];

    public float getBalance(){
        float sum = 0;

        for (int i = 0; i < clients.length; i++) {
            sum+= clients[i].getFortune();
        }
        return sum;
    }

    public void addClient(){
        for (int i = 0; i < clients.length; i++) {
            if(clients[i] == null){
                clients[i].setId(i);
            }
        }

    }

    public void removeClient(int id){
        for (int i = 0; i < clients.length; i++) {
            if(clients[i].getId()==id){
                clients[i]=null;
                for (int j = (i+1); j < clients.length; j++) {
                    clients[j] = clients[j-1];
                }

            }
        }
    }
}

这是程序线程:

package bank.program;

import bank.elements.Account;
import bank.elements.Client;
import bank.elements.Bank;

public class Program {
    public static void main(String[] args) {
        Bank b = new Bank();
        b.addClient();
        b.clients[0].setBalance(100);
        b.clients[0].addAccount(2);
        System.out.println(b.clients[0].getFortune());
    }
}

我想念什么?

用户名

用你的addClient()方法:

for (int i = 0; i < clients.length; i++) {
      if(clients[i] == null){
           clients[i].setId(i);
      }
 }

因此,抛出NPE是完全正常的,因为您检查了位于阵列第i个位置的Client对象是否存在null,然后您试图从该对象访问方法,因此也要访问NPE。

执行此操作时public Client[] clients = new Client[100];,将数组的100个插槽初始化为null(Java中Object的默认值初始化)。

我会在您的构造函数中对其进行初始化:

public Bank(){
   for(int i = 0; i < clients.length; i++){
      clients[i] = new Client();
   }
}

更改addClient()方法中的if if client[i] != null以防止发生NPE),即:

for (int i = 0; i < clients.length; i++) {
      if (client[i] != null){
          clients[i].setId(i);
     }
 }

对您的Client班级使用相同的注释,数组为Account

还可以考虑阅读以下内容:java-什么是空指针异常?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章