# Arraylist mit Objekten



## Vlinder (30. Sep 2015)

Hallo,
ich komme bei meiner Hausaufgabe leider nicht weiter, dies ist die Aufgabe:


> You are going to build a simple system of a bank with accounts. The program reads commands from input and executes them on the accounts (such as withdrawals, deposits, enrolling of new accounts, printing, etc.).
> 
> For this assignment the command reader has already been implemented and is provided together with the other skeleton files.
> 
> ...


*
*
Das Programm besteht aus 3 Klassen (vorgegeben)

```
class Account {
    private String name;
    private int balance;
   
    //object constructor
    Account (String name){
        balance = 0;                      //sets initial balance to 0
        this.name = name;                 //sets name to given name
    }
   
    //method to give name to account
    void setName(String name){
        this.name = name;            //this refers to object on which method is called
    }
   
    //method to add specified amount to current balance
    void addAmount(int amount){
        balance = balance + amount;
    }
   
}
```

Hier ist schon meine erste Frage kann ich das so machen mit dem Object constructor um ein Objekt Account zu erstellen?


```
import java.util.ArrayList;

class Bank {
    Account account;
    ArrayList<Account> accounts;
   
    // creates the arraylist
    void createArray() {
        accounts = new ArrayList<Account>();
    }
   
    //checks if account name is in arraylist, if yes adds amount to it
    void deposit(String name, int amount) {
        if (accounts.contains(name)) {                       //doesn't work
            int index = accounts.indexOf(name);
            accounts.get(index).addAmount(amount);
            //balance = accounts.get(index);
           
        }else {
            System.out.println("no such name "+name);
        }      
    }
   
    //puts a new account in arraylist if arraylist does not contain name already
    void enroll(String name) {
        if (accounts.contains(name)) {
            System.out.println(name+" already enrolled");
           
        }else {
            accounts.add(new Account(name));
            int index = accounts.indexOf(name);
            accounts.get(index).setName(name);
        }
       
    }

    void interest(double rate) {
    }

    void print(String name) {
       
    }

    void printAll() {
        System.out.println(accounts);
    }

    void printRed() {
    }

    void withdraw(String name, int amount) {
    }
}
```

Hier dann meine Hauptprobleme, was ich bei enroll und deposit mache funktioniert nicht (die anderen sind noch nicht eingefuellt weil ich dort das selbe Problem haette). Wie kann ich nun der arraylist ein Objekt account hinzufuegen? 


Der Commandreader ist komplett so vorgegeben:

```
import java.util.Scanner;


public class CommandReader {
    Bank bank;
    Scanner scanner;

    /**
     * CommandReader constructor, creates the Bank and Scanner objects.
     */
    public CommandReader() {
        bank = new Bank();
        scanner = new Scanner(System.in);
    }

    /**
     * readCommands scans the input for commands and distributes the commands
     * to the appropriate method in bank.
     */
    public void readCommands() {
        String command = "";
        String name = "";
        int amount = 0;
        double rate = 0.0;

        do {
            command = scanner.next().toLowerCase();

            switch (command) {
                case "enroll":
                    name = scanner.next();
                    bank.enroll(name);
                    break;
                case "deposit":
                    name = scanner.next();
                    amount = scanner.nextInt();
                    bank.deposit(name, amount);
                    break;
                case "withdraw":
                    name = scanner.next();
                    amount = scanner.nextInt();
                    bank.withdraw(name, amount);
                    break;
                case "print":
                    name = scanner.next();
                    bank.print(name);
                    break;
                case "printall":
                    bank.printAll();
                    break;
                case "printred":
                    bank.printRed();
                    break;
                case "interest":
                    rate = scanner.nextDouble();
                    bank.interest(rate);
                    break;
                case "stop":
                    // do nothing
                    break;
                default:
                    System.out.println("unknown command");
                    //skip rest of line
                    scanner.nextLine();
            }
        } while (!command.equals("stop"));
    }

    /**
     * Starting point of the program, creates a new commandReader and calls
     * the readCommands method.
     */
    public static void main(String[] args) {
        CommandReader commandReader = new CommandReader();
        commandReader.readCommands();
    }
}
```

Das Programm compiled zwar aber wenn ich es laufen lasse kommt immer ein Error.
Wenn ich z.B. erst enroll und dann in der zweiten Zeile einen Namen eingebe kommt folgendes:


> java.lang.NullPointerException
> at Bank.enroll(Bank.java:30)
> at CommandReader.readCommands(CommandReader.java:36)
> at CommandReader.main(CommandReader.java:79)
> ...



Danke schonmal fuer die Hilfe!


----------



## Dompteur (30. Sep 2015)

Dir fehlt bei der Bank Klasse ein Default Konstruktur.
Darin solltest du das Array anlegen.
Die Methode "createArray" wird nämlich nirgends aufgerufen und daher bleibt dein Array immer null.


----------

