2014-01-04 4 views
-1

Я работаю на упражнение, где я построить банковскую систему, я создал класс счета, класс клиента и класс банка, однако, когда я проверить программу я получаю:Как избежать нулевых свойств?

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()); 
    } 
} 

Что мне не хватает?

+3

Где вы получаете NPE. Просьба предоставить stacktrace и соответствующий код. –

+0

[Это объясняется с помощью C#, но многие из этих концепций одинаковы в Java. Пожалуйста, прочитайте это первым, чтобы понять, что такое NPE.] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+1

Я получил его в функциональной строке addClient() моя проблема не была инициализирована массивом с объектами в первую очередь, @ user2336315 помог мне понять это –

ответ

3

В вашем addClient() метода:

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

Так что это совершенно нормальный NPE брошен потому, что вы проверить, если объект клиента в позиции г-м массива является null, а затем вы пытаетесь получить доступ к методе от этого объекта и, следовательно, от NPE.

Когда вы делаете public Client[] clients = new Client[100];, 100 слотов массива инициализируются до null (инициализация значения по умолчанию объекта в Java).

Я бы инициализировать его в конструкторе:

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

Измените ваш, если в вашем addClient() методе (сделать if client[i] != null предотвратить NPE), а именно:

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

Тот же комментарий для Client класс с массивом Account.

считают также прочитать: java-What is a Null Pointer Exception?

+0

Если это значение null, вы выполняете операцию над ним. Это даст NPE, чтобы это не предотвратить. Проверка должна быть! = –

+0

@AniketThakur Да, я добавил это. – user2336315

+0

@downvoter Уход за комиссией? – user2336315

Смежные вопросы