Erro StackOverFlow

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

Ao instanciar ContaPoupanca, essa linha é chamada, pois faz parte dos campos da classe pai. E essa linha instancia a classe novamente… criando um loop infinito.

1 curtida