Eu estou tentando criar um programa para realizar saques e depósitos a partir de uma conta e deu esse erro aqui
Exception in thread "main" java.lang.StackOverflowError
at java.base/java.lang.StringBuffer.setLength(StringBuffer.java:228)
at java.base/java.text.DecimalFormat.expandAffix(DecimalFormat.java:2993)
at java.base/java.text.DecimalFormat.expandAffixes(DecimalFormat.java:2961)
at java.base/java.text.DecimalFormat.applyPattern(DecimalFormat.java:3637)
at java.base/java.text.DecimalFormat.<init>(DecimalFormat.java:466)
at java.base/sun.util.locale.provider.NumberFormatProviderImpl.getInstance(NumberFormatProviderImpl.java:203)
at java.base/sun.util.locale.provider.NumberFormatProviderImpl.getNumberInstance(NumberFormatProviderImpl.java:161)
at java.base/java.text.NumberFormat.getInstance(NumberFormat.java:978)
at java.base/java.text.NumberFormat.getInstance(NumberFormat.java:962)
at java.base/java.text.NumberFormat.getNumberInstance(NumberFormat.java:518)
at java.base/java.util.Scanner.useLocale(Scanner.java:1270)
at java.base/java.util.Scanner.<init>(Scanner.java:543)
at java.base/java.util.Scanner.<init>(Scanner.java:566)
at Aulas/herançaContaBancária.ContaBancaria.<init>(ContaBancaria.java:4)
at Aulas/herançaContaBancária.ContaPoupanca.<init>(ContaPoupanca.java:3)
at Aulas/herançaContaBancária.ContaBancaria.<init>(ContaBancaria.java:9)
at Aulas/herançaContaBancária.ContaPoupanca.<init>(ContaPoupanca.java:3)
at Aulas/herançaContaBancária.ContaBancaria.<init>(ContaBancaria.java:9)
at Aulas/herançaContaBancária.ContaPoupanca.<init>(ContaPoupanca.java:3)
(repete o erro nas linha 3 e 9 infinitamente)
A linha 4 aponta para isso aqui
** Scanner scan = new Scanner(System.in);**
**A linha 3 aponta para **
public class ContaPoupanca extends ContaBancaria{
A linha 9 aponta para **
** ContaPoupanca contaPoupanca = new ContaPoupanca();
Aqui está o código completo:
package herançaContaBancária;
import java.util.Scanner;
public class ContaBancaria {
Scanner scan = new Scanner(System.in); // O ´primeiro erro aponta para cá
String nomeCliente;
String numConta;
double saldo = 0;
ContaPoupanca contaPoupanca = new ContaPoupanca(); // O terceiro erro está aqui
ContaEspecial contaEspecial = new ContaEspecial();
public ContaBancaria(String nomeCliente, String numConta, double saldo) {
super();
this.nomeCliente = nomeCliente;
this.numConta = numConta;
this.saldo = saldo;
}
public ContaBancaria() {
// TODO Auto-generated constructor stub
}
public String getNomeCliente() {
return nomeCliente;
}
public void setNomeCliente(String nomeCliente) {
this.nomeCliente = nomeCliente;
}
public String getNumConta() {
return numConta;
}
public void setNumConta(String numConta) {
this.numConta = numConta;
}
public double getSaldo() {
return saldo;
}
public void setSaldo(double saldo) {
this.saldo = saldo;
}
public double Sacar() {
double saque;
System.out.println("Digite o valor que você deseja sacar, por favor.");
saque = scan.nextDouble();
if(getSaldo()<=saque) {saldo -= saque;setSaldo(saldo);}
else {System.out.println("O valor que você deseja sacar está acima do seu saldo. Digite novamente");Sacar();}
return getSaldo();
}
public double Depositar() {
System.out.println("Digite o valor que você deseja depositar");
double deposito;
deposito = scan.nextDouble();
saldo += deposito; setSaldo(saldo);
return getSaldo();
}
void menuInicial() {
System.out.println("Digite 1 se você deseja utilizar uma conta poupança, 2 se você quer utilizar uma conta especial e 3 se você deseja"
+ " sair do programa");
int menu = scan.nextInt();
if (menu==1) {contaPoupanca.ColetarSaldo();}
else if(menu==2) {contaEspecial.ColetarSaldo();}
else if(menu==3) {Sair();}
else{System.out.println("Valor inválido. Digite novamente.");menuInicial();}
}
void Sair() {
System.out.println("Obrigado por utilizar nossos serviços");
}
}
package herançaContaBancária;
import java.util.Scanner;
public class ContaPoupanca extends ContaBancaria { // O segundo erro está aqui
Scanner scan = new Scanner(System.in);
double diaRendimento;
public double getDiaRendimento() {
return diaRendimento;
}
public void setDiaRendimento(double diaRendimento) {
this.diaRendimento = diaRendimento;
}
public double Sacar() {
double saque;
System.out.println("Digite o valor que você deseja sacar, por favor.");
saque = scan.nextDouble();
if (getSaldo() <= saque) {
saldo -= saque;setSaldo(saldo);
} else {
System.out.println("O valor que você deseja sacar está acima do seu saldo. Digite novamente");Sacar();
}
return getSaldo();
}
void menuPoupanca() {
System.out.println("Digite 1 se você deseja depositar na sua conta poupança, 2 se você deseja verificar seu saldo a partir da taxa"
+ " de rendimentos, 3 se você quer sacar, 4 se você deseja sair e 5 se deseja ir para a conta especial");
int menu = scan.nextInt();
if(menu==1) {System.out.println("Você acabou de depositar. Seu saldo agora é "+Depositar());}
else if(menu==2) {System.out.println("Seu saldo é "+calcularNovoSaldo());}
else if(menu==3) {System.out.println("Você acabou de sacar. Seu saldo agora é "+Sacar());}
else if(menu==4) {Sair();}
else if(menu==5) {contaEspecial.ColetarSaldo();}
else {System.out.println("Valor inválido. Digite novamente.");menuPoupanca();}
}
public double calcularNovoSaldo() {
System.out.println("Digite qual é a taxa de rendimento da sua poupança.");
setDiaRendimento(scan.nextDouble());
System.out.println("Digite há quantos dias a sua poupança está rendendo.");
int dias = scan.nextInt();
super.saldo = super.getSaldo() * (1 + getDiaRendimento()/100) * dias;
super.setSaldo(super.saldo);
return getSaldo();
}
public double Depositar() {
System.out.println("Digite o valor que você deseja depositar");
double deposito;
deposito = scan.nextDouble();
saldo += deposito; setSaldo(saldo);
return getSaldo();
}
ContaBancaria contaBancaria = new ContaBancaria();
void ColetarSaldo() {
if(super.saldo == 0) {System.out.println("Digite qual é o saldo da sua conta poupança");
setSaldo(scan.nextDouble());}
menuPoupanca();
}
}
package herançaContaBancária;
import java.util.Scanner;
public class ContaPoupanca extends ContaBancaria{
Scanner scan = new Scanner(System.in);
double diaRendimento;
public double getDiaRendimento() {
return diaRendimento;
}
public void setDiaRendimento(double diaRendimento) {
this.diaRendimento = diaRendimento;
}
public double Sacar() {
double saque;
System.out.println("Digite o valor que você deseja sacar, por favor.");
saque = scan.nextDouble();
if(getSaldo()<=saque) {saldo -= saque;setSaldo(saldo);}
else {System.out.println("O valor que você deseja sacar está acima do seu saldo. Digite novamente");Sacar();}
return getSaldo();
}
void menuPoupanca() {
System.out.println("Digite 1 se você deseja depositar na sua conta poupança, 2 se você deseja verificar seu saldo a partir da taxa"
+ " de rendimentos, 3 se você quer sacar, 4 se você deseja sair e 5 se deseja ir para a conta especial");
int menu = scan.nextInt();
if(menu==1) {System.out.println("Você acabou de depositar. Seu saldo agora é "+Depositar());}
else if(menu==2) {System.out.println("Seu saldo é "+calcularNovoSaldo());}
else if(menu==3) {System.out.println("Você acabou de sacar. Seu saldo agora é "+Sacar());}
else if(menu==4) {Sair();}
else if(menu==5) {contaEspecial.ColetarSaldo();}
else {System.out.println("Valor inválido. Digite novamente.");menuPoupanca();}
}
public double calcularNovoSaldo() {
System.out.println("Digite qual é a taxa de rendimento da sua poupança.");
setDiaRendimento(scan.nextDouble());
System.out.println("Digite há quantos dias a sua poupança está rendendo.");
int dias = scan.nextInt();
super.saldo = super.getSaldo() * (1 + getDiaRendimento()/100) * dias;
super.setSaldo(super.saldo);
return getSaldo();
}
public double Depositar() {
System.out.println("Digite o valor que você deseja depositar");
double deposito;
deposito = scan.nextDouble();
saldo += deposito; setSaldo(saldo);
return getSaldo();
}
ContaBancaria contaBancaria = new ContaBancaria();
void ColetarSaldo() {
if(super.saldo == 0) {System.out.println("Digite qual é o saldo da sua conta poupança");
setSaldo(scan.nextDouble());}
menuPoupanca();
}
}
package herançaContaBancária;
import java.util.Scanner;
public class TesteConta {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// TODO Auto-generated method stub
ContaBancaria contaBancaria = new ContaBancaria();
System.out.println("Seja bem vindo aos serviços do banco. Digite o seu nome");
contaBancaria.setNomeCliente(scan.next());
System.out.println("Digite o número da sua conta");
contaBancaria.setNumConta(scan.next());
System.out.println("Cliente: "+contaBancaria.getNomeCliente()+"\n"+"Número da conta: "+contaBancaria.getNumConta());
//contaBancaria.menuInicial();
}
}