Exception in thread "main" java.lang.StackOverflowError

2 respostas
J

Olá a todos! Estou começando os meus estudos em Java. E para começar, estou fazendo um programa simples para cálculo de IMC (índice de massa corporea).

Eu montei o programa com 5 classes.

  • main: classe principal
  • Mensagens: classe responsável em exibir as mensagens para interação com o usuário.
  • CalculaIMC: classe responsável por realizar o cálculo do IMC. Ela converte as informações de string para int e double antes de realizar o cálculo
  • ClassificaIMC: classe responsável por classificar o grau de obesidade do usuário conforme o resultado de IMC obtido
  • EntradaDeDados: classe responsável por realizar a entrada de dados digitada pelo usuário e associar à strings

Porém ao tentar executar no Netbeans 6.9 no Linux Ubuntu 10.10 64bit com Java 1.6.0_24 ocorre o erro “Exception in thread “main” java.lang.StackOverflowError”.
O que é isso? O que estou fazendo de errado?

Este é o erro completo na saída do Netbeans (coloquei aqui nesta nensagem … porque a mensagem se repete muitas vezes com o mesmo erro)

run:
Exception in thread "main" java.lang.StackOverflowError
        at calculodeimc.ClassificaIMC.<init>(ClassificaIMC.java:18)
        at calculodeimc.CalculaIMC.<init>(CalculaIMC.java:26)
        at calculodeimc.ClassificaIMC.<init>(ClassificaIMC.java:22)
....
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

Estas são as classes:

main

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calculodeimc;

import java.util.Scanner;


public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        //String nome;
        //String pesostr;
        //String alturastr;
        //Double imc;
        //Integer grau;

        Mensagens exibe_mensagem = new Mensagens ();
        CalculaIMC calculo = new CalculaIMC();
        ClassificaIMC classifica = new ClassificaIMC();
        EntradaDeDados entrada = new EntradaDeDados();


        exibe_mensagem.solicitaNome();
        entrada.coletaNome();
        //nome = teclado.nextLine();

        exibe_mensagem.solicitaAltura();
        entrada.coletaAltura();
        //alturastr=teclado.nextLine();
        

        exibe_mensagem.solicitaPeso();
        entrada.coletaPeso();
        //pesostr = teclado.nextLine();

        calculo.conversao();
        calculo.calculo();

        exibe_mensagem.informaIMC();

        //classifica.setImc(imc);
        classifica.classificao();

        exibe_mensagem.informaGrau();



    }

}

Mensagens

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calculodeimc;

/**
 *
 * @author jeffersonx
 */
public class Mensagens {

    EntradaDeDados entrada = new EntradaDeDados();
    CalculaIMC calculo = new CalculaIMC();
    ClassificaIMC classificacao = new ClassificaIMC();

    public Mensagens() {
    }

    private int grau;

       public void solicitaNome ()  {
        System.out.println("Por favor, digite o seu nome:");
    }

    public void solicitaPeso () {
        System.out.println("Informe seu peso:");
    }

    public void solicitaAltura(){
        System.out.println("Informe a sua altura:");
    }
    public void informaIMC(){
        System.out.println(entrada.getNome() + ", o seu ICM é:" + calculo.getImc() + ".") ;
    }

    public void informaGrau(){
        this.grau=classificacao.getGrau();
        if (grau==1){
            System.out.println("O seu grau de IMC é: Magresa. Procure seu nutricionista.");
        } else if (grau==2){
            System.out.println("Parabéns! O seu grau de IMC é: Saudável.");
        } else if (grau==3){
            System.out.println("Atenção! O seu grau de IMC é: Sobrepeso. Procure seu nutricionista.");
        } else if (grau==4){
            System.out.println("Atenção! O seu grau de IMC é: Obesidade - Grau I. Procure seu médico.");
        } else if (grau==5){
            System.out.println( "Atenção! O seu grau de IMC é: Obesidade - Grau II. Procure seu médico.");
        }
        System.out.println("ATENÇÃO!! Seu grau de IMC é: Obesidade - Grau III (mórbida). Procure o seu médico imediatamente!");
    }

}

CalculaIMC

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calculodeimc;

/**
 *
 * @author jeffersonx
 */
public class CalculaIMC {

    private String pesostr;
    private String alturastr;

    private int peso;
    private double altura;
    private double imc;
   

    //Construtor
    public void CalculaIMC(){
    }

    ClassificaIMC classifica = new ClassificaIMC();
    EntradaDeDados entrada = new EntradaDeDados();

    public double getImc() {
        return imc;
    }



    //Método de conversão dos dados fornecidos de String para Int e Float
    public void conversao(){
        this.alturastr = entrada.getAlturastr();
        this.pesostr = entrada.getPesostr();
        this.altura=Double.parseDouble(alturastr);
        this.peso=Integer.parseInt(pesostr);
    }

    //Método para cálculo do IMC
    public void calculo(){
        this.imc=peso/(altura*altura)    ;
    }

}

ClassificaIMC

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calculodeimc;

/**
 *
 * @author jeffersonx
 */
public class ClassificaIMC {

    private double imc;
    private int grau;
    
    //Construtor
    public ClassificaIMC(){

    }

    CalculaIMC calculo = new CalculaIMC();

    public int getGrau() {
        return grau;
    }


    /*
     * Metodo de classificação do IMC conforme o cálculo.
     *  Grau de IMC:
     * 1 - Magreza
     * 2 - Saudável
     * 3 - Sobrepeso
     * 4 - Obesidade - Grau I
     * 5 - Obesidade - Grau II (severa)
     * 6 - Obesidade - Grau III (mórbida)
     */

   public void classificao() {

       this.imc=calculo.getImc();

       if (imc<18.5){
           grau= 1;

       } else if (imc<=24.9){
           grau = 2;
       } else if (imc <=29.9){
           grau = 3;
       } else if (imc <=34.9){
           grau = 4;
       } else if (imc <=39.9){
           grau = 5;
       }
       grau = 6;
   }


}

EntradaDeDados

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */ 

package calculodeimc;

import java.util.Scanner;

/**
 *
 * @author jeffersonx
 */
public class EntradaDeDados {

    private String nome;
    private String alturastr;
    private String pesostr;

    Scanner teclado = new Scanner(System.in);

    public EntradaDeDados(){

    }

    public String getAlturastr() {
        return alturastr;
    }

    public String getNome() {
        return nome;
    }

    public String getPesostr() {
        return pesostr;
    }

    public void coletaNome(){
        this.nome = teclado.nextLine();
    }

    public void coletaAltura(){
        this.alturastr=teclado.nextLine();
    }

    public void coletaPeso(){
        this.pesostr=teclado.nextLine();
    }

}

2 Respostas

ViniGodoy

Uma classe sua faz new na outra. Por isso, o java irá criar classes sem parar, até o momento que dá a StackOverflowException.

Atenção: Cada new cria um objeto diferente.

J

Muito obrigado ViniGodoy. O problema é esse mesmo.
Abraço

Criado 22 de abril de 2011
Ultima resposta 11 de mai. de 2011
Respostas 2
Participantes 2