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