Error: Exception in thread "main" - StackOverflowError

-3

I created a CRUD from a library, but when I instantiated the class Biblioteca in main , and I went to execute that giant error occurred:

ClassCadastrar:

packageOperacoes;importjava.util.InputMismatchException;importjava.util.Scanner;importEntidades.Autor;importEntidades.Editora;importEntidades.Livro;importRepositorioLivros.Biblioteca;publicclassCadastrar{ScannerscannerNumerico=newScanner(System.in);ScannerscannerString=newScanner(System.in);Bibliotecabiblioteca=newBiblioteca();//AutorpublicvoidcadastrarAutor(){try{Autorautor=newAutor();System.out.println("Digite o nome:");
              autor.setNome(scannerString.nextLine());  

              System.out.println("Digite o nacionalidade:");
              autor.setNacionalidade(scannerString.nextLine()); 

              System.out.println("Digite o codigo:");
              autor.setCodigo(scannerNumerico.nextInt());  

              System.out.println("Digite o email:");
              autor.setEmail(scannerString.nextLine()); 

              biblioteca.cadastarAutor(autor);

            }catch(Exception e){
                System.out.println("Error: Algum dado não foi digitado corretamente");
            }

        }


        //Editora
        public void cadastrarEditora(){


            try{
                Editora editora= new Editora();

                System.out.println("Digite o nome:");
                editora.setNome(scannerString.nextLine());


                System.out.println("Digite o código:");
                editora.setCodigo(scannerNumerico.nextInt());


                System.out.println("Digite o CNPJ:");
                editora.setCnpj(scannerNumerico.nextInt());

                biblioteca.cadastrarEditora(editora);

                }catch(Exception e){
                   System.out.println("Error: Algum dado não foi digitado corretamente");
                }
            }


        //Livro
        public void cadastrarLivro(){
            try{
                Livro livro= new Livro();

                System.out.println("Digite o nome do livro:");
                livro.setNome(scannerString.nextLine());

                System.out.println("Digite o código do livro:");
                livro.setCodigo(scannerNumerico.nextInt());

                System.out.println("Digite o ano do livro:");
                livro.setAno(scannerNumerico.nextInt());

                System.out.println("Forneça a editora do livro:");
                livro.setEditora(scannerString.nextLine());

                biblioteca.cadastrarLivro(livro);

                }catch(Exception e){
                    System.out.println("Error: Algum dado não digitado corretamente");
                }

        }


        //Menu com as opções
        public void escolherOpcao(){

            int opc=0;

            System.out.println("-====== MENU: CADASTRAR ======-\n\n" +
                    "1) Cadastrar autor \n" +
                    "2) Cadastar Editora \n" +
                    "3) Cadastrar Livro\n"+
                    "4) Voltar"+
                    "5) Sair");


            boolean flag = true;


            while(flag){
                /*Enquanto a flag for verdadeira, ou seja, quando houver erro,
                o while irá repetir a opção pro usuário digitar novamente*/

                System.out.println("Digite a opção desejada:");


            try{
                opc=scannerNumerico.nextInt();
                flag = false; 
                // quando Ñ houver erro a flag vai ser falsa, e o programa segue normalmente


            }catch(InputMismatchException e){

                  System.out.println("Error: Só pode digitar números inteiros de  1 a 5");

         }
            }


            switch(opc){

            case 1:{
                this.cadastrarAutor();
            break;

            }


            case 2:{
                this.cadastrarEditora();
            break;

            }


            case 3:{
                this.cadastrarLivro();
            break;
            }

            //voltar ao menu
            case 4:{
                break;
            }


            case 5:{
                System.exit(0);
                break;
            }

            default:{
                break;
            }

        }//chave do Switch
        }//chave do método do menu

}

Class Biblioteca :

package RepositorioLivros;

import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.JOptionPane;

import Entidades.Autor;
import Entidades.Editora;
import Entidades.Livro;
import Operacoes.Cadastrar;
import Operacoes.Editar;
import Operacoes.Excluir;
import Operacoes.ExcluirTudo;
import Operacoes.Listar;
import Operacoes.Pesquisar;


    public class Biblioteca {

        Scanner scannerNumerico = new Scanner(System.in);
        Scanner scannerString = new Scanner(System.in);  


        //Instância das classes das operações
        Cadastrar cadastro=new Cadastrar();
        Editar editar=new Editar();
        Pesquisar pesquisar=new Pesquisar();
        Listar listar=new Listar();
        Excluir excluir=new Excluir();
        ExcluirTudo excluirTudo=new ExcluirTudo();


        String result;



        // Array list das entidades

        ArrayList <Autor> autores= new ArrayList<Autor>();
        ArrayList<Editora> editora= new ArrayList<Editora>();
        ArrayList<Livro> livro= new ArrayList<Livro>();


        //Menus
        public void Menu() {
        int opc=0;

        System.out.println("-======MENU======-\n\n" +
                "1. Cadastrar\n" +
                "2. Editar\n" +
                "3. Pesquisar\n" +
                "4. Listar\n" +
                "5. Excluir\n" +
                "6. Excluir tudo\n" +
                "7. Sair");

        boolean flag=true;

        while(flag){
            System.out.println("Digite a opção desejada:");


            try{
                opc=scannerNumerico.nextInt();
                flag=false;

            }catch(Exception e){
             System.out.println("Só pode digitar números inteiros de  1 a 7");

            }

        }


        switch(opc){

        //Opções de cadastro
        case 1:{
            cadastro.escolherOpcao();
            break;
       }

        //Opções de editar
        case 2:{
            editar.Menu();
            break;
        }

        //Opções de pesquisar
        case 3:{
             pesquisar.Menu();
             break;
        }


        //Opções de listar
        case 4:{
            listar.Menu();
            break;
        }


        //Opções de excluir
        case 5:{
            excluir.menu();
            break;
        }


        //Opções de excluir tudo
        case 6:{
            excluirTudo.Menu();
            break;
        }


        //Sair
        case 7:{
            System.out.println("Obrigado por usar meu sistema !");
            System.exit(0);
            break;
        }

        default:{
            break;
        }

    }

}




        //Autores

        public void cadastarAutor(Autor autor) {
            this.autores.add(autor); 
        }


        public String ListarAutores() {


            for(int i=0; i<autores.size(); i++){

            result="Código:"+autores.get(i).getCodigo()+
            "\nNome:"+autores.get(i).getNome()+
            "\nNacionalidade"+autores.get(i).getNacionalidade()+
            "\nEmail:"+autores.get(i).getEmail();

            }

            return result;
        }



        public Autor pesquisarAutor(int codigo) {

            for(int i=0; i<autores.size(); i++){

            if(autores.get(i).getCodigo()==codigo)
            return autores.get(i);
                }
            }

            return null;
        }


        public void removerAutorAnterior(Autor codigo) {

            autores.remove(codigo);
        }



        public void removerTodosAtores() {
            autores.clear();

        }





        //Editora

        public void cadastrarEditora(Editora editora) {
            this.editora.add(editora);

        }


        public String listarEditora() {

            for(int i=0; i<editora.size(); i++){
                result="Nome\n"+editora.get(i).getNome()+
                "\nCNPJ"+editora.get(i).getCnpj()+
                "\nCódigo"+editora.get(i).getCodigo();
            }


            return result;
        }


        public Editora pesquisarEditora(int codigo) {

            for(int i=0; i<editora.size(); i++){

                if(editora.get(i).getCodigo()==codigo){
                    editora.get(i);

                }

            }
            return null;
        }



        public void removerEditoraAnterior(Editora codigo) {

         editora.remove(codigo);
        }


        public void removerTodasEditoras() {
            editora.clear();

        }





        //Livro

        public void cadastrarLivro(Livro livro) {
            this.livro.add(livro);
        }



        public String listarLivro() {
            for(int i=0; i<livro.size(); i++){

                result= "Nome:\n"+livro.get(i).getNome()+
                        "Código:"+livro.get(i).getCodigo()+
                        "\nAno:"+livro.get(i).getAno()+
                        "Editora:"+livro.get(i).getEditora();


            }

            return result;
        }


        public Livro pesquisarLivro(int codigo) {

            for(int i=0; i<livro.size(); i++){

                if(livro.get(i).getCodigo()==codigo){
                    livro.get(i);

                }

            }


            return null;
        }


        public void revomerLivroAnterior(Livro codigo) {
            this.livro.remove(codigo);


        }


        public void removerTodosLivros() {
            livro.clear();

        }


}

I'll put the complete code in my GitHub, because it's too big: link

First look at class Biblioteca and class Cadastrar , I think there must be something wrong in one of the two.

    
asked by anonymous 01.07.2017 / 02:29

1 answer

0

Who came first? The egg or the chicken?

Look at this:

public class Cadastrar {
    Biblioteca biblioteca= new Biblioteca();
}

public class Biblioteca {
    //Instância das classes das operações
    Cadastrar cadastro=new Cadastrar();
}

And then, when creating a Cadastrar instance, a new instance of Biblioteca is created and placed in the biblioteca attribute. However, when creating a new instance of Biblioteca , another instance of Cadastrar is created and placed in cadastro attributes.

Well, to instantiate a Biblioteca you instantiate a Cadastrar , which in turn when instantiated, instantiates another Biblioteca , which when instantiated, instantiates another Cadastrar , which when instantiated, Instantiates another Biblioteca , which when instantiated, instantiates another Cadastrar , which when instantiated, instantiates another Biblioteca [...]

... And so it would be for all time and for all eternity were it not for the fact that the execution pile is finite and the builders are stepping on it more and more. One hour, the execution stack fills so much that it explodes. The name of this explosion is StackOverflowError .

Sorry for the sincerity, but your code is very bad and full of problems. To fix all the problems, I would have to practically rewrite from scratch. So I'm going to limit myself to solving just% of%. There are several ways to resolve this, but the first solution I see in this case is to work with constructors:

public class Cadastrar {

    private Biblioteca biblioteca;

    public Cadastrar(Biblioteca biblioteca) {
        this.biblioteca = biblioteca;
    }
}

public class Biblioteca {
    //Instância das classes das operações
    Cadastrar cadastro = new Cadastrar(this);
}

In this solution, you eliminate the egg and chicken problem by making it clear who comes first. The StackOverflowError object comes first and Biblioteca is created based on an already existing Cadastrar instead of creating a new one. The Biblioteca object is responsible for creating Biblioteca by reporting itself as the Cadastrar already existing.

The second solution is to use singletons:

public class Biblioteca {
    public static final INSTANCIA = new Biblioteca();

    private Biblioteca() {
    }
}

public class Cadastrar {
    public static final INSTANCIA = new Cadastrar();

    private Cadastrar() {
    }
}

And then, in the Biblioteca class, instead of using the Biblioteca attribute, use cadastro . In the Cadastrar.INSTANCIA class, instead of using the Cadastrar attribute, use biblioteca . In this solution, only one static instance of each is created and they refer to each other only when one needs the other.

    
01.07.2017 / 07:32