3
I’m solving a question from Deitel’s book question 3.17, but I have a problem in the main class (I’m doing it for Eclipse, in the Linux environment). The code is like this:
public class HealthProfile{
private String nome;
private String sobrenome;
private String sexo;
private int dia;
private int mes;
private int ano;
private float altura;
private float peso;
public HealthProfile(String nome, String sobrenome,
String sexo, int dia, int mes, int ano, float altura,
float peso)
{
this.nome = nome;
this.sobrenome = sobrenome;
this.sexo = sexo;
this.dia = dia;
this.mes = mes;
this.ano = ano;
this.altura = altura;
this.peso = peso;
}
public void setNome(String nome)
{
this.nome = nome;
}
public String getNome()
{
return nome;
}
public void setSobrenome(String sobrenome)
{
this.sobrenome = sobrenome;
}
public String getSobrenome()
{
return sobrenome;
}
public void setSexo(String sexo)
{
this.sexo = sexo;
}
public String getSexo()
{
return sexo;
}
public void setDia(int dia)
{
if ((dia >= 1) && (dia <= 31))
this.dia = dia;
}
public int getDia()
{
return dia;
}
public void setMes(int mes)
{
if ((mes >= 1) && (mes <= 12))
this.mes = mes;
}
public int getMes()
{
return mes;
}
public void setAno(int ano)
{
if (ano >= 1900)
this.ano = ano;
}
public int getAno()
{
return ano;
}
public void setAltura(float altura)
{
if (altura >= 100)
this.altura = altura;
}
public float getAltura()
{
return altura;
}
public void setPeso(float peso)
{
if (peso >= 70)
this.peso = peso;
}
public float getPeso()
{
return peso;
}
public int idadeEmAnos()
{
return 2019 - getAno();
}
public int maximumFrequenciaCardiaca()
{
return 220 - idadeEmAnos();
}
public double MinFrequenciaCardiacaAlvo()
{
return 0.5 * maximumFrequenciaCardiaca();
}
public double MaxFrequenciaCardiacaAlvo()
{
return 0.85 * maximumFrequenciaCardiaca();
}
public float getIMC()
{
float IMC = getPeso() / (getAltura() * getAltura());
return IMC;
}
}
And the main class is like this:
import java.util.Scanner;
public class Principal {
public static void main() {
HealthProfile health = new HealthProfile(null, null, null, 0, 0, 0, 0, 0);
Scanner input = new Scanner( System.in );
System.out.println("Informe seu nome: ");
String nome = input.nextLine();
health.setNome(nome);
System.out.println("Informe seu sobrenome: ");
String sobrenome = input.nextLine();
health.setSobrenome(sobrenome);
System.out.println("Informe seu sexo: ");
String sexo = input.nextLine();
health.setSexo(sexo);
System.out.println("Informe seu dia de nascimento: ");
int dia = input.nextInt();
health.setDia(dia);
System.out.println("Informe seu mes de nascimento: ");
int mes = input.nextInt();
health.setMes(mes);
System.out.println("Informe seu ano de nascimento: ");
int ano = input.nextInt();
health.setAno(ano);
System.out.println("Informe sua altura: ");
float altura = input.nextFloat();
health.setAltura(altura);
System.out.println("Informe seu peso: ");
float peso = input.nextFloat();
health.setPeso(peso);
System.out.printf("%s ", health.getNome());
System.out.printf("%s%n", health.getSobrenome());
System.out.printf("%d anos", health.idadeEmAnos());
System.out.printf("Sua frequencia máxima é %d%n", health.maximumFrequenciaCardiaca());
System.out.println("Frequencia Cardiaca Alvo:");
System.out.printf("A Minima frequencia alvo é : %.0f%n", health.MinFrequenciaCardiacaAlvo());
System.out.printf("A Maxima frequencia alvo é : %.0f%n", health.MaxFrequenciaCardiacaAlvo());
}
}
I’d like to understand this problem you’re having in the eclipse:
Description Resource Path Location Type
Resource leak: 'input' is never closed Principal.java
/ComputadorizacaoScannerSaude/src line 9 Java Problem
He says this problem is on line 9 that’s this one:
Scanner input = new Scanner( System.in );
In the main function.
And that’s not letting me compile the program.
Obs.:
Another way I implemented and there was no problem was using the JOptionPane
:
import javax.swing.JOptionPane;
public class Principal{
public static void main(String[] args) {
int dia, mes, ano;
float altura, peso;
String nome = JOptionPane.showInputDialog("Nome: ");
String sobrenome = JOptionPane.showInputDialog("Sobrenome: ");
String sexo = JOptionPane.showInputDialog("Sexo: ");
dia = Integer.parseInt(JOptionPane.showInputDialog("Digite o dia do seu nascimento (em digitos)"));
mes = Integer.parseInt(JOptionPane.showInputDialog("Digite o mês do nascimento (como antes)"));
ano = Integer.parseInt(JOptionPane.showInputDialog("Digite o ano do seu nascimento (como antes)"));
altura = Float.parseFloat(JOptionPane.showInputDialog("Altura(em metros): "));
peso = Float.parseFloat(JOptionPane.showInputDialog("Peso(em quilogramas): "));
HealthProfile health = new HealthProfile(nome, sobrenome, sexo, dia, mes, ano, altura, peso);
String message = String.format(
"Nome:%s\nSobrenome:%s\nSexo:%s\nData de Nascimento:%d/%d/%d\nIdade em Anos:%d\nFrequencia Cardiaca Maxima:%d\nFrequencia Cardiaca Alvo:[%.2f;%.2f]\nIMC:%.2f",
health.getNome(), health.getSobrenome(), health.getSexo(), health.getDia(), health.getMes(),
health.getAno(), health.idadeEmAnos(), health.maximumFrequenciaCardiaca(), health.MinFrequenciaCardiacaAlvo(),
health.MaxFrequenciaCardiacaAlvo(), health.getIMC());
JOptionPane.showMessageDialog(null, message);
}
}
Well, I would say that what is worth most is the hint of the link you gave, in large letters, capital letters, bold and red: "DO NOT CLOSE A SCANNER OBJECT INITIALIZED WITH System.in !" - In my opinion, close the
System.in
or aScanner
using it is something simply too stupid to do. Mislead the methodclose()
is just another way of doing gambiarra. If the eclipse is not able to identify this special case and gives a Warning, This is the eclipse problem, not the code problem, and therefore the@SuppressWarnings
is more than justified.– Victor Stafusa
@Victorstafusa I agree, I also find it unnecessary to close the
System.in
(and "pretend" that it is closing is in fact a gambiarra). But I opted for a more "neutral" answer, showing several alternatives, and then each draws its own conclusions...– hkotsubo