Exercício Array de Objeto fj11-contas

A classe Banco deve ter um método adiciona , que recebe uma referência a Conta
como argumento e guarda essa conta.
Você deve inserir a Conta em uma posição da array que esteja livre. Existem várias maneiras para
você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma
posição vazia toda vez. O que seria mais interessante?
Se quiser verificar qual a primeira posição vazia (nula) e adicionar nela, poderia ser feito algo como:

public void adiciona(Conta c) {
    for(int i = 0; i < this.contas.length; i++){
    // verificar se a posição está vazia
    // adicionar no array
    }
}

É importante reparar que o método adiciona não recebe titular, agencia, saldo, etc. Essa seria uma
maneira nem um pouco estruturada, muito menos orientada a objetos de se trabalhar. Você antes
cria uma Conta e já passa a referência dela, que dentro do objeto possui titular, saldo, etc.

Meu método está:

public void adiciona(Conta c) {
    for (int i = 0; i < this.contas.length; i++) {
        if (contas[i] == null) {
            if (contas[i].equals(c) == true) {
                System.out.println("Conta igual!");
	        } else {
		    contas[i] = c;
		    System.out.println("Conta salva!");
		}
        } else {
            System.out.println("Espaço já alocado!");
        }
    }
}

Porém ele sempre retorna NullPointerException quando vai rodar o método.

Tem que colocar a classe?
Tem que colocar o número de posições certinho na pergunta?

Umas ideias para tu:

1 - Classe Banco:

public class Banco {
	private static final int TAMANHO = 5;
	private int codigoBanco;
	private int indice = 0;
	private String nomeBanco;
	private Agencia[] agencias = new Agencia[TAMANHO];
	
	/*
	* Métodos de banco
	*/
	public void adicionarConta(String agencia, Conta conta){
		for(int i = 0; i < indice; i++){
			if(getAgencia()[i].getNumeroAgencia().equals(agencia))
				getAgencia()[i].setConta(conta);
		}
	}
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setCodigoBanco(int codigoBanco){
		this.codigoBanco = codigoBanco;
	}
	
	public int getCodigoBanco(){
		return codigoBanco;
	}
	
	public void setNomeBanco(String nomeBanco){
		this.nomeBanco = nomeBanco;
	}
	
	public String getNomeBanco(){
		return nomeBanco;
	}
	
	public void setAgencia(Agencia agencia){
		if(indice < TAMANHO)
			this.agencias[indice++] = agencia;
		else
			System.out.println("Limite máximo de ag~encias atingido!");
	}
	
	public Agencia[] getAgencia(){
		return agencias;
	}
}

2 - Classe Agência

public class Agencia {
	private static final int TAMANHO = 5;
	private int indice = 0;
	private String numeroAgencia;
	private Conta[] contas = new Conta[TAMANHO];
	private String endereco;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setNumeroAgencia(String numeroAgencia){
		this.numeroAgencia = numeroAgencia;
	}
	
	public String getNumeroAgencia(){
		return numeroAgencia;
	}
	
	
	public void setConta(Conta conta){
		if(indice < TAMANHO)
			this.contas[indice++] = conta;
		else
			System.out.println("Limite máximo de contas atingido!");
	}
	
	public Conta[] getConta(){
		return contas;
	}
	
	public void setEndereco(String endereco){
		this.endereco = endereco;
	}
	
	public String getEndereco(){
		return endereco;
	}
}

3 - Classe Conta

public class Conta {
	private String numeroConta;
	private String tipoConta;
	private double saldo;
	
	/*
	* Métodos de conta
	*/
	public void efetuarDeposito(double quantia){
		if(quantia >= 0)
			setSaldo(getSaldo() + quantia);
		else
			System.out.println("Valor inválido!");
	}
	
	public void efetuarSaque(double quantia){
		if(quantia >= 0){
			if(quantia < getSaldo())
				setSaldo(getSaldo() - quantia);
			else
				System.out.println("Saldo insuficiente!");
			
		}else
			System.out.println("Valor inválido!");
	}
	
	public void emitirExtrato(){
		System.out.println("+------------------------------+");
		System.out.println("|Cliente:                      |");
		System.out.println("+------------------------------+");
	}
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setNumeroConta(String numeroConta){
		this.numeroConta = numeroConta;
	}
	
	public String getNumeroConta(){
		return numeroConta;
	}
	
	public void setTipoConta(String tipoConta){
		this.tipoConta = tipoConta;
	}
	
	public String getTipoConta(){
		return tipoConta;
	}
	
	private void setSaldo(double saldo){
		this.saldo = saldo;
	}
	
	public double getSaldo(){
		return saldo;
	}
}

4 - Classe SistemaBancario (Main):

public class SistemaBancario {
	private Banco[] bancos = new Banco[50];
	
	public static void main(String[] args){
		SistemaBancario sistemaBancario = new SistemaBancario();
		
		Banco banco1 = new Banco();
		Agencia agencia1 = new Agencia();
		Conta conta1 = new Conta();
		Conta conta2 = new Conta();
		
		conta1.setNumeroConta("22756-9");
		conta1.setTipoConta("CC");
		conta1.efetuarDeposito(10.00);
		
		conta2.setNumeroConta("28291-0");
		conta2.setTipoConta("CP");
		conta2.efetuarDeposito(10.00);
		
		agencia1.setNumeroAgencia("0520-7");
		agencia1.setEndereco("Avenida São Paulo, 1457, Centro, Loanda-Pr");
		
		banco1.setCodigoBanco(17);
		banco1.setNomeBanco("Banco do Brasil");
		banco1.setAgencia(agencia1);
		banco1.adicionarConta("0520-7", conta1);
		banco1.adicionarConta("0520-7", conta2);
		
		banco1.getAgencia()[0].getConta()[0].efetuarDeposito(998.00);
		banco1.getAgencia()[0].getConta()[1].efetuarDeposito(338.21);
		
		sistemaBancario.bancos[0] = banco1;
		
		System.out.println("+------------------------------+");
		System.out.println("| Informações do Banco Central |");
		System.out.println("+------------------------------+");
		System.out.println("| Banco: " + sistemaBancario.bancos[0].getNomeBanco() + "|");
		System.out.println("| Agência: " 
			+ sistemaBancario.bancos[0].getAgencia()[0].getNumeroAgencia() 
			+ "|");
		System.out.println("| Conta: " 
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[0].getNumeroConta()
			+ " - "
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[0].getTipoConta()
			+ "|");
			
		System.out.println("| Saldo: " 
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[0].getSaldo() 
			+ "|");
			
		System.out.println("| Conta: " 
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[1].getNumeroConta()
			+ " - "
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[1].getTipoConta()
			+ "|");
			
		System.out.println("| Saldo: " 
			+ sistemaBancario.bancos[0].getAgencia()[0].getConta()[1].getSaldo() 
			+ "|");
			
		System.out.println("+------------------------------+");
	}
}

Rodando um teste:

image

Veja bem o seu código:

public void adiciona(Conta c) {
    for (int i = 0; i < this.contas.length; i++) {
        if (contas[i] == null) { // se contas[i] estiver null, vai entrar no if
            if (contas[i].equals(c) == true) { // contas[i] está null, não dá pra chamar o método equals nem nenhum método em um objeto null
                System.out.println("Conta igual!");
            } else {
                contas[i] = c;
                System.out.println("Conta salva!");
            }
        } else {
            System.out.println("Espaço já alocado!");
        }
    }
}

Faça assim:

public void adiciona(Conta c) {
    for (int i = 0; i < this.contas.length; i++) {
        if (contas[i] == null) { // se contas[i] estiver null, vai entrar no if
            if (c.equals(contas[i])) { // inverte o teste chamando o método equals a partir do objeto c
                System.out.println("Conta igual!");
            } else {
                contas[i] = c;
                System.out.println("Conta salva!");
            }
        } else {
            System.out.println("Espaço já alocado!");
        }
    }
}

O problema é que ele tá salvando somente a primeira conta que eu crio com esse código:

public static void main(String[] args) {

		Banco banco = new Banco("CaelumBank", 999);

		for (int i = 0; i < 10; i++) {
			ContaCorrente conta = new ContaCorrente();
			System.out.println(i);
			conta.setTitular("Titular " + i);
			conta.setNumero(i);
			conta.setAgencia("1000");
			conta.deposita(i * 1000);
			banco.adiciona(conta);
		}
		
		banco.mostraContas();
	}