Error: Exception in thread "main" - Stackoverflowerror

Asked

Viewed 133 times

-3

I created a library CRUD, but when I installed the class Biblioteca in the main, and was running occurred this giant error:

StackOverflowError

Class Cadastrar:

package Operacoes;

import java.util.InputMismatchException;
import java.util.Scanner;

import Entidades.Autor;
import Entidades.Editora;
import Entidades.Livro;
import RepositorioLivros.Biblioteca;

public class Cadastrar {
    Scanner scannerNumerico = new Scanner(System.in);
    Scanner scannerString = new Scanner(System.in);  
    Biblioteca biblioteca= new Biblioteca();

        //Autor
        public void cadastrarAutor(){

            try{
               Autor autor= new Autor();

              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 full code on my Github because it’s too big: https://github.com/ViniciusStark/Codes

Look at the class first Biblioteca and the class Cadastrar, I think there must be something wrong with one of the two.

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, by creating an instance of Cadastrar, a new instance of Biblioteca is created and placed in the attribute biblioteca. However, by creating a new instance of Biblioteca, another instance of Cadastrar is created and placed in the attributes cadastro.

Well, to instantiate a Biblioteca you instance a Cadastrar, which in turn when being instantiated, instantiates another Biblioteca, that when it is instantiated, it instantiates another Cadastrar, that while being instantiated, it instantiates another Biblioteca, that when it is instantiated, it instantiates another Cadastrar, that while being instantiated, it instantiates another Biblioteca [...]

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

I’m sorry to be blunt, but your code is very bad and full of problems. To fix all the problems, I would have to practically rewrite from scratch. Therefore, I will limit myself to solving only the StackOverflowError. There are several ways to solve this, but the first solution I see in this case is to work with builders:

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 problem of the egg and the chicken by making it clear who comes first. The object Biblioteca comes first and the Cadastrar is established on the basis of a Biblioteca existing instead of creating a new one. The object Biblioteca is responsible for creating the Cadastrar informing himself as the Biblioteca 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 class Biblioteca, instead of using the attribute cadastro, use Cadastrar.INSTANCIA. In class Cadastrar, instead of using the attribute biblioteca, use Biblioteca.INSTANCIA. In this solution, only one static instance of each is created and they refer to each other only when one needs the other.

  • Okay friend, as I said I’m beginner, I think I would be better if you showed me your solution implemented within my code, would not have to show the first solution that you said implemented within the Register class? , I’d really appreciate it

Browser other questions tagged

You are not signed in. Login or sign up in order to post.