Java.lang.NullPointerException

Meu primeiro post aqui.

Sou iniciante em Java e estou tentando fazer um programa semelhante à um banco.

eis o código:
http://localhost:8080/FAQ/Mobile/Login.jsp

[code]package Banco2;

import java.util.Scanner;

public class Conta {
private String titular;
private String cpf;
private String rg;
private Double saldo = 10000.00;
private String numeroConta;
Conta[] armazenador = new Conta[10];

public void NovaConta() {
	Scanner scanner = new Scanner(System.in);
	for (int i = 0; i < armazenador.length; i++)
		if (armazenador[i] == null) {
			System.out.println("Digite o nome do titular: ");
			armazenador[i].titular = scanner.nextLine();
			System.out.println("Digite o número da conta do titular: ");
			armazenador[i].numeroConta = scanner.nextLine();
			System.out.println("Digite o CPF do titular: ");
			armazenador[i].cpf = scanner.nextLine();
			System.out.println("Digite o RG do titular: ");
			armazenador[i].rg = scanner.nextLine();
			Acesso();
		}
}

public void Acesso() {
	System.out.println(armazenador[0].titular);
}

public void SaldoInsuficiente(double quantidade) {
	if (quantidade > saldo) {
		System.out.println("Saldo insuficiente para realizar a operação.");
		ContaMenu();

	}
}

public void Saldo() {
	System.out.println("Seu saldo é de: " + saldo);
}

public void MostrarTudo() {
	System.out.println("Informações da conta:");
	System.out.println("Titular: " + titular);
	System.out.println("Saldo: " + saldo);
	System.out.println("CPF: " + cpf);
	System.out.println("RG: " + rg);
	System.out.println("Número da conta: " + numeroConta);
	ContaMenu();
}

public void ContaMenu() {
	System.out
			.println("Digite 1 para ver todas as informações da conta.\nDigite 2 para sacar dinheiro.\nDigite 3 para depositar.\nDigite 4 para transferir.\nDigite 5 para encerrar essa seção.");
	Scanner scanner = new Scanner(System.in);
	int menu = scanner.nextInt();

}

public void Sacar() {
	System.out.println("Digite a quantidade que deseja sacar: ");
	Scanner scanner = new Scanner(System.in);
	double quantidade = scanner.nextDouble();
	SaldoInsuficiente(quantidade);
	System.out.println("Foram sacados: " + quantidade
			+ " reais da sua conta.");
	saldo -= quantidade;
	Saldo();
	ContaMenu();
}

public void Depositar() {
	System.out.println("Digite a quantidade que deseja depositar: ");
	Scanner scanner = new Scanner(System.in);
	double quantidade = scanner.nextDouble();
	saldo += quantidade;
	Saldo();
	ContaMenu();
}

public void Transferir(Conta destino) {
	System.out
			.println("Digite o número da conta que irá receber o dinheiro: ");
	Scanner scanner = new Scanner(System.in);
	System.out.println("Digite a quantidade a ser transferida: ");
	numeroConta = scanner.nextLine();
	double quantidade = scanner.nextDouble();
	SaldoInsuficiente(quantidade);
	saldo -= quantidade;
	destino.saldo += quantidade;
	Saldo();
	ContaMenu();
}

public static void main(String[] args) {
	Conta superConta = new Conta();
	superConta.NovaConta();

}

}[/code]

Quando chega na linha 18 ele da o seguinte erro:

Exception in thread “main” java.lang.NullPointerException
at Banco2.Conta.NovaConta(Conta.java:18)
at Banco2.Conta.main(Conta.java:101)

Lembrando que ainda faltam algumas coisas a serem implementados a este código.

Meu objetivo é usar um array do tipo Conta para armazenar as outras contas. Alguém pode me explicar o que eu estou fazendo de errado?

Outra dúvida que eu tenho é: o scanner tem algun limite em relação ao número de váriaveis que eu posso usar?Por exemplo, em um outro código que eu estava usando, toda vez que eu mandava ele ler a 5ª ou a 6ª variável ele simplesmente ignorava e continuava o código (inclusive tentei trocar a ordem e sempre o último era ignorado).

Agradeço desde já.

bem vindo a excessão mais famosa do java!
hehehe

bem provavel que esteja fazendo acesso a algo não instanciado…

… a uma debugada no codigo, no meio do processo tu vai achar onde tá ocasionando o null pointer…

abraço velho!
t+

Antes de definires o titular da conta, tens de criar a conta:

			if (armazenador[i] == null) {
				armazenador[i] = new Conta();
				System.out.println("Digite o nome do titular: ");
				armazenador[i].titular = scanner.nextLine();

Como nosso amigo disse, você não instanciou

for (i = 0; i < armazenador.length; i++)
			{	
				
				if (armazenador[i] == null) {
					armazenador[i] = new Conta(); //Aqui vc ta dizendo que a posição [i] vai receber uma Conta
					System.out.println("Digite o nome do titular: ");
					armazenador[i].titular = scanner.next();
					System.out.println("Digite o número da conta do titular: ");
					armazenador[i].numeroConta = scanner.next();
					System.out.println("Digite o CPF do titular: ");
					armazenador[i].cpf = scanner.next();
					System.out.println("Digite o RG do titular: ");
					armazenador[i].rg = scanner.next();
					Acesso();
				}
			}

Você não está instanciando um objeto do tipo Conta. Você só instancia o vetor “armazenador”.
Ao invés de fazer:

armazenador[i].titular = scanner.nextLine(); 

tente fazer:

Conta conta = new Conta(); conta.titular = scanner.nextLine();

Outra coisa, crie gets e sets para os atributos da classe Conta ao invés de acessá-los diretamente (como vc faz para atribuir o titular, por exemplo).

Vlw.

[quote=tucano]bem vindo a excessão mais famosa do java!
hehehe

bem provavel que esteja fazendo acesso a algo não instanciado…

… a uma debugada no codigo, no meio do processo tu vai achar onde tá ocasionando o null pointer…

abraço velho!
t+[/quote]

Pelo o que eu andei lendo é a mais famosa mesmo, usei o debug várias vezes e não estava achando a resposta.

[quote=williamdasflores]Como nosso amigo disse, você não instanciou

[code]
for (i = 0; i < armazenador.length; i++)
{

			if (armazenador[i] == null) {
				armazenador[i] = new Conta(); //Aqui vc ta dizendo que a posição [i] vai receber uma Conta
				System.out.println("Digite o nome do titular: ");
				armazenador[i].titular = scanner.next();
				System.out.println("Digite o número da conta do titular: ");
				armazenador[i].numeroConta = scanner.next();
				System.out.println("Digite o CPF do titular: ");
				armazenador[i].cpf = scanner.next();
				System.out.println("Digite o RG do titular: ");
				armazenador[i].rg = scanner.next();
				Acesso();
			}
		}

[/code][/quote]

Muito obrigado, funcionou aqui :slight_smile:

[quote=programadora]Você não está instanciando um objeto do tipo Conta. Você só instancia o vetor “armazenador”.
Ao invés de fazer:

armazenador[i].titular = scanner.nextLine(); 

tente fazer:

Conta conta = new Conta(); conta.titular = scanner.nextLine();

Outra coisa, crie gets e sets para os atributos da classe Conta ao invés de acessá-los diretamente (como vc faz para atribuir o titular, por exemplo).

Vlw.

[/quote]

Ainda estou estudando java e não cheguei nessa parte.

Obrigado pela ajuda de todos.

Ola novamente.

Eu estou com um outro problema:

[code]package Banco2;

import java.util.Scanner;

public class Console {
public int a;

public void MenuInicial() {
	Conta conta = new Conta();
	System.out
			.println("Para criar uma nova conta digite 1.\nPara acessar uma conta digite 2.\nPara encerrar a seção digite 3.");
	Scanner scanner = new Scanner(System.in);
	Conta armazenador[] = new Conta[10];
	int menu = scanner.nextInt();
	switch (menu) {
	case 1:
		armazenador = conta.NovaConta(armazenador);			
		MenuInicial();
		break;
	case 2:
		conta.Acesso(armazenador);
		break;
	default:
		System.exit(1);
		break;
	}
}

public static void main(String[] args) {
	System.out.println("Bem vindo ao banco.");
	Console menu = new Console();
	menu.MenuInicial();
}

}
[/code]

[code]package Banco2;

import java.util.Scanner;

public class Conta {
private String titular;
private String cpf;
private String rg;
private Double saldo = 10000.00;
private String numeroConta;
Conta[] armazenador = new Conta[10];

public Conta[] NovaConta(Conta armazenador[]) {
	Scanner scanner = new Scanner(System.in);
	for (int i = 0; i < armazenador.length; i++)
		if (armazenador[i] == null) {
			armazenador[i] = new Conta();
			System.out.println("Digite o nome do titular: ");
			armazenador[i].titular = scanner.nextLine();
			System.out.println("Digite o número da conta do titular: ");
			armazenador[i].numeroConta = scanner.nextLine();
			System.out.println("Digite o CPF do titular: ");
			armazenador[i].cpf = scanner.nextLine();
			System.out.println("Digite o RG do titular: ");
			armazenador[i].rg = scanner.nextLine();
			i = 10;
		}
	return armazenador;

}

public void Acesso(Conta[] armazenador) {
	System.out
			.println("Digite o número da conta que você deseja acessar: ");
	Scanner scanner = new Scanner(System.in);
	String a = scanner.nextLine();
	for (int i = 0; i < 10; i++) {
		if (a.equals(armazenador[i].numeroConta)) {
			System.out.println("Acesso concedido.");
			ContaMenu();
		} else
			System.out.println("Numero da conta inválido.");

	}
}

public void SaldoInsuficiente(double quantidade) {
	if (quantidade > saldo) {
		System.out.println("Saldo insuficiente para realizar a operação.");
		ContaMenu();

	}
}

public void Saldo() {
	System.out.println("Seu saldo é de: " + saldo);
}

public void MostrarTudo() {
	System.out.println("Informações da conta:");
	System.out.println("Titular: " + armazenador[0].titular);
	System.out.println("Saldo: " + armazenador[0].saldo);
	System.out.println("CPF: " + armazenador[0].cpf);
	System.out.println("RG: " + armazenador[0].rg);
	System.out.println("Número da conta: " + armazenador[0].numeroConta);
	ContaMenu();
}

public void ContaMenu() {
	System.out
			.println("Digite 1 para ver todas as informações da conta.\nDigite 2 para sacar dinheiro.\nDigite 3 para depositar.\nDigite 4 para transferir.\nDigite 5 para encerrar essa seção.");
	Scanner scanner = new Scanner(System.in);
	int menu = scanner.nextInt();
	switch (menu) {
	case 1:
		MostrarTudo();
		break;
	case 2:
		Sacar();
		break;
	case 3:
		Depositar();
		break;
	case 4:
		Transferir();
		break;
	default:
		System.exit(1);
	}

}

public void Sacar() {
	System.out.println("Digite a quantidade que deseja sacar: ");
	Scanner scanner = new Scanner(System.in);
	double quantidade = scanner.nextDouble();
	SaldoInsuficiente(quantidade);
	System.out.println("Foram sacados: " + quantidade
			+ " reais da sua conta.");
	saldo -= quantidade;
	Saldo();
	ContaMenu();
}

public void Depositar() {
	System.out.println("Digite a quantidade que deseja depositar: ");
	Scanner scanner = new Scanner(System.in);
	double quantidade = scanner.nextDouble();
	saldo += quantidade;
	Saldo();
	ContaMenu();
}

public void Transferir() {
	System.out
			.println("Digite o número da conta que irá receber o dinheiro: ");
	Scanner scanner = new Scanner(System.in);
	System.out.println("Digite a quantidade a ser transferida: ");
	numeroConta = scanner.nextLine();
	double quantidade = scanner.nextDouble();
	SaldoInsuficiente(quantidade);
	saldo -= quantidade;
	// destino.saldo += quantidade;
	Saldo();
	ContaMenu();
}

}
[/code]

Pois bem, eu gostaria de saber se existe alguma forma de eu criar um unico array do tipo conta para armazenar todas as contas. Dentro do for (quando for criar as contas (metodo NovaConta)) ele cria mais objetos do tipo conta que ficarão armazenados dentro do array.

Olá de novo!
Você pode criar até 10 contas para inserir no seu vetor, porque você definiu isso na declaração:

Conta[] armazenador = new Conta[10];  

Eu só não entendi porque ao final do for (do método “NovaConta”) você atribui i = 10;
Desta forma, realizando estra atribuição, você consegue inserir apenas 1 conta no seu vetor, porque da segunda vez que ele passar no for, ele fará o teste “i < armazenador.length” e como você atribuiu i = 10 e o tamanho do vetor é igual a 10, esse teste retornará “false” e não haverá mais elementos no seu vetor.
Se quiser inserir mais elementos, retire a atribuição “i=10”.

[quote=programadora]Olá de novo!
Você pode criar até 10 contas para inserir no seu vetor, porque você definiu isso na declaração:

Conta[] armazenador = new Conta[10];  

Eu só não entendi porque ao final do for (do método “NovaConta”) você atribui i = 10;
Desta forma, realizando estra atribuição, você consegue inserir apenas 1 conta no seu vetor, porque da segunda vez que ele passar no for, ele fará o teste “i < armazenador.length” e como você atribuiu i = 10 e o tamanho do vetor é igual a 10, esse teste retornará “false” e não haverá mais elementos no seu vetor.
Se quiser inserir mais elementos, retire a atribuição “i=10”.[/quote]

A intenção de colocar i=10 no final era para que quando ele chegasse no final do loop for ele não se repitir mais 9 vezes, assim, apos o for ele volta para o MenuInicial e se o usuario quiser criar uma outra conta é só ele digitar 1 (no menu).

O meu problema agora é que ele cria a conta numa boa, no entanto não consegue acessar.

Acho que entendi o que vc quer.
Fiz algumas modificações no código… Dá uma comparada com o seu aí e veja se é isso mesmo.

[code]public class Console {
public int a;
private Conta armazenador[];
public void MenuInicial(Conta armazenador[]) {
System.out
.println(“Para criar uma nova conta digite 1.\nPara acessar uma conta digite 2.\nPara encerrar a seção digite 3.”);
Scanner scanner = new Scanner(System.in);
Conta conta = new Conta();
int menu = scanner.nextInt();
switch (menu) {
case 1:
armazenador = conta.NovaConta(armazenador);
MenuInicial(armazenador);
break;
case 2:
conta.Acesso(armazenador);
break;
default:
System.exit(1);
break;
}
}

 public static void main(String[] args) {  
     System.out.println("Bem vindo ao banco.");  
     Console menu = new Console();
     menu.armazenador = new Conta[10];
     menu.MenuInicial(menu.armazenador);  
 }  

} [/code]

[code]public class Conta {
private String titular;
private String cpf;
private String rg;
private Double saldo = 10000.00;
private String numeroConta;

public Conta[] NovaConta(Conta[] armazenador) {
	Scanner scanner = new Scanner(System.in);
	for (int i = 0; i < armazenador.length; i++) {
		if (armazenador[i] == null) {
			armazenador[i] = new Conta();
			System.out.println("Digite o nome do titular: ");
			armazenador[i].titular = scanner.nextLine();
			System.out.println("Digite o número da conta do titular: ");
			armazenador[i].numeroConta = scanner.nextLine();
			System.out.println("Digite o CPF do titular: ");
			armazenador[i].cpf = scanner.nextLine();
			System.out.println("Digite o RG do titular: ");
			armazenador[i].rg = scanner.nextLine();
			i = 10;
		}
	}
	return armazenador;
}

 public void Acesso(Conta[] armazenador) {  
     System.out  
             .println("Digite o número da conta que você deseja acessar: ");  
     Scanner scanner = new Scanner(System.in);  
     String a = scanner.nextLine();  
     for (int i = 0; i < 10; i++) {  
         if (a.equals(armazenador[i].numeroConta)) {  
             System.out.println("Acesso concedido.");  
             ContaMenu();  
         } else  
             System.out.println("Numero da conta inválido.");  

     }  
 }  

 public void SaldoInsuficiente(double quantidade) {  
     if (quantidade > saldo) {  
         System.out.println("Saldo insuficiente para realizar a operação.");  
         ContaMenu();  

     }  
 }  

 public void Saldo() {  
     System.out.println("Seu saldo é de: " + saldo);  
 }  

 public void MostrarTudo() {  
	 System.out.println("Informações da conta:");  
     System.out.println("Titular: " + titular);  
     System.out.println("Saldo: " + saldo);  
     System.out.println("CPF: " + cpf);  
     System.out.println("RG: " + rg);  
     System.out.println("Número da conta: " + numeroConta);  
     ContaMenu();  
 }  

 public void ContaMenu() {  
     System.out  
             .println("Digite 1 para ver todas as informações da conta.\nDigite 2 para sacar dinheiro.\nDigite 3 para depositar.\nDigite 4 para transferir.\nDigite 5 para encerrar essa seção.");  
     Scanner scanner = new Scanner(System.in);  
     int menu = scanner.nextInt();  
     switch (menu) {  
     case 1:  
         MostrarTudo();  
         break;  
     case 2:  
         Sacar();  
         break;  
     case 3:  
         Depositar();  
         break;  
     case 4:  
         Transferir();  
         break;  
     default:  
         System.exit(1);  
     }  

 }  

 public void Sacar() {  
     System.out.println("Digite a quantidade que deseja sacar: ");  
     Scanner scanner = new Scanner(System.in);  
     double quantidade = scanner.nextDouble();  
     SaldoInsuficiente(quantidade);  
     System.out.println("Foram sacados: " + quantidade  
             + " reais da sua conta.");  
     saldo -= quantidade;  
     Saldo();  
     ContaMenu();  
 }  

 public void Depositar() {  
     System.out.println("Digite a quantidade que deseja depositar: ");  
     Scanner scanner = new Scanner(System.in);  
     double quantidade = scanner.nextDouble();  
     saldo += quantidade;  
     Saldo();  
     ContaMenu();  
 }  

 public void Transferir() {  
     System.out  
             .println("Digite o número da conta que irá receber o dinheiro: ");  
     Scanner scanner = new Scanner(System.in);  
     System.out.println("Digite a quantidade a ser transferida: ");  
     numeroConta = scanner.nextLine();  
     double quantidade = scanner.nextDouble();  
     SaldoInsuficiente(quantidade);  
     saldo -= quantidade;  
     // destino.saldo += quantidade;  
     Saldo();  
     ContaMenu();  
 }  

} [/code]

Eu basicamente retirei a instanciação do vetor armazenador de dentro do método “MenuInicial” e toda vez que mexo nesse vetor, eu passo novamente para o método “MenuInicial” para que este trabalhe com o vetor correto. Não sei se está correto, veja se funciona aí.

OBS: nao fiz a melhor das programações. hehehe

Ae agora sim esse problema foi resolvido.

Deixe-me ver se eu entendi:

a) Você instanciou o armazenador fora do metodo para que o programa não ficasse reinstanciando ele toda hora que o metodo fosse chamado ele trabalhasse somente com aquele.a

b) Você tambem criou um array do tipo conta para a classe console.

Eu entendi o ponto a) mas nao entendi o ponto b).

Pode me explicar?

E obrigado pela ajuda.

Só criei o armazenador ali pra poder ter uma referência para passar pro método “MenuInicial”, o que é desnecessário, pois eu poderia ter instanciado esse vetor dentro do próprio main e ter passado para este método, ou até mesmo em sua chamada, assim:

menu.MenuInicial(new Conta[10]);

Como eu nao testei direito, acredito q esse código que postei possa ter outros problemas, se realmente existirem e vc precisar, posta aí!

:wink:

[quote=programadora]Só criei o armazenador ali pra poder ter uma referência para passar pro método “MenuInicial”, o que é desnecessário, pois eu poderia ter instanciado esse vetor dentro do próprio main e ter passado para este método, ou até mesmo em sua chamada, assim:

menu.MenuInicial(new Conta[10]);

Como eu nao testei direito, acredito q esse código que postei possa ter outros problemas, se realmente existirem e vc precisar, posta aí!

:wink: [/quote]

O que eu quis dizer era aqui:

public class Console { public int a; private Conta armazenador[];

Linha 3.

Exatamente sobre essa referência que estou falando.
Eu não precisava ter declarado aí… Expliquei no post anterior que isso foi desnecessário, que eu poderia ter declarado no próprio main ou instanciado direto na chamada do método.

Amigão,

Lembre-se sempre que quando você cria um novo Array ele vem com as referências nulas caso se referencie a algum objeto. Por isso o ocorreu o famoso NullPointerException…
Ou seja, sempre que você for acessar algum elemento deste array, você deve instancia-lo.
no seu caso armazenador é um array de Conta, logo deve sempre fazer:

armazenador[i] = new Conta();

Abraços,