2013-09-06 4 views
0

Это то, что я должен сделать «Напишите приложение Java, которое запрашивает информацию о человеке, создает экземпляр объекта класса« Профиль здоровья »для этого человека и печатает информацию с этого объекта, включая человека Имя, фамилия, пол, дата рождения, рост и вес - затем вычисляет и печатает возраст человека в годах, ИМТ, максимальный пульс и диапазон сердечных сокращений, а также отображает " BMI "из упражнения 2. 33." Но я получаю ошибки всякий раз, когда я запускаю его.Имея проблемы с выходом

Вот код:

import java.util.*; 
public class HealthProfile { 

String firstName; 
String lastName; 
char gender; 
int BirthMonth; 
int BirthDay; 
int BirthYear; 
int height; 
int weight; 

public HealthProfile(String fName, String lName, char Genderr, int birthMonth, int birthDay, int birthYear, int heightt, int weightt){ 
    firstName = fName; 
    lastName = lName; 
    gender = Genderr; 
    BirthMonth = birthMonth; 
    BirthDay = birthDay; 
    BirthYear = birthYear; 
    height = heightt; 
    weight = weightt; 



} 

    HealthProfile() { 

    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setGender(char gender) { 
     this.gender = gender; 
    } 

    public char getGender() { 
     return gender; 
    } 

    public void setBirthMonth(int BirthMonth) { 
     this.BirthMonth = BirthMonth; 
    } 

    public int getBirthMonth() { 
     return BirthMonth; 
    } 

    public void setBirthDay(int BirthDay) { 
     this.BirthDay = BirthDay; 
    } 

    public int getBirthDay() { 
     return BirthDay; 
    } 

    public void setBirthYear(int BirthYear) { 
     this.BirthYear = BirthYear; 
    } 

    public int getBirthYear() { 
     return BirthYear; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

    public double getHeight() { 
     return height; 
    } 

    public void setWeight(int weight) { 
     this.weight = weight; 
    } 

    public double getWeight() { 
     return weight; 
    } 

public int Age(){ 
Calendar now = Calendar.getInstance(); 
int nowYear = now.get(Calendar.YEAR); 
int nowMonth = now.get(Calendar.MONTH); 
int nowDay = now.get(Calendar.DATE); 
int day = now.get(Calendar.DATE); 
int month = now.get(Calendar.MONTH); 
int year = now.get(Calendar.YEAR); 
if (nowMonth > BirthMonth); 
return (nowYear - BirthYear); 
    } 

public double getBMI(){ 
    return (weight * 703)/(height * height); 
} 

public int MaxHeartRate(){ 
return 220-Age(); 
} 

public double TargetHeartRate(){ 
return MaxHeartRate() * 0.85 + MaxHeartRate() * 0.5; 
} 
} 

Вот часть теста:

import java.util.Scanner; 

public class HealthProfileTest { 
public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     String firstName; 
     String lastName; 
     String DoB; 
     String theMonth; 
     String theDay; 
     String theYear; 
     char gender; 
     int Month; 
     int Day; 
     int Year; 
     double height = 0.0; 
     double weight; 
     HealthProfile personalInfo = new HealthProfile(); 
     System.out.println("Enter your first name: "); 
     firstName = input.nextLine(); 
     System.out.println("Enter your last name: "); 
     lastName = input.nextLine(); 
     System.out.println("Male or female: "); 
     gender = input.nextLine().charAt(0); 
     System.out.println("Enter your date of birth in mm/dd/yyyy format: "); 
     DoB = input.nextLine(); 
     theMonth = DoB.substring(0,2); 
     theDay = DoB.substring(3,5); 
     theYear = DoB.substring(6,10); 
     Month = Integer.parseInt(theMonth); 
     Day = Integer.parseInt(theDay); 
     Year = Integer.parseInt(theYear); 
     System.out.println("Enter your height in inches: "); 
     height = input.nextInt(); 
     System.out.println("Enter your weight in pounds: "); 
     weight = input.nextInt(); 
     System.out.println("Name: " + personalInfo.getFirstName() + personalInfo.getLastName()); 
     System.out.println("Gender: " + personalInfo.getGender()); 
     System.out.println("DoB: " + personalInfo.getBirthMonth() + "/" + personalInfo.getBirthDay() + "/" + personalInfo.getBirthYear()); 
     System.out.println("Height: " + personalInfo.getHeight()); 
     System.out.println("Weight: " + personalInfo.getWeight()); 
     System.out.println("Age: " + personalInfo.Age()); 
     System.out.println("BMI: " + personalInfo.getBMI()); 
     System.out.printf("Max heart rate: ", personalInfo.MaxHeartRate()); 
     System.out.printf("Target heart rate: ", personalInfo.TargetHeartRate()); 
     System.out.println(" "); 
     System.out.println("BMI VALUES"); 
     System.out.println("Underweight: Under 18.5"); 
     System.out.println("Normal: 18.5-24.9 "); 
     System.out.println("Overweight: 25-29.9"); 
     System.out.println("Obese: 30 or over"); 
    } 
    } 

Здесь выход:

Name: nullnull 
Gender: 
DoB: 0/0/0 
Height: 0.0 
Weight: 0.0 
Age: 2013 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
     at HealthProfile.getBMI(HealthProfile.java:108) 
     at HealthProfileTest.main(HealthProfileTest.java:43) 
Java Result: 1 

Я знаю, что я сделал все правильно, но только дон Почему бы это не сделать.

ответ

2

Вы забыли перечислить методы setHeight и setWeight. Поэтому эти значения по-прежнему 0 по умолчанию, учитывая, что они являются числовыми примитивными типами. Очевидно, что произведение двух нулевых значений равно 0 и затем деление на 0 вызывает ArithmeticException

Попробуйте вызвать методы после приема входов.

System.out.println("Enter your height in inches: "); 
height = input.nextInt(); 
personalInfo.setHeight((int) height); 
System.out.println("Enter your weight in pounds: "); 
weight = input.nextInt(); 
personalInfo.setWeight((int) weight); 

Аналогично установить "рождения" поля

personalInfo.setBirthMonth(Month); 
personalInfo.setBirthDay(Day); 
personalInfo.setBirthYear(Year); 

Помимо: Java именования показывают, что переменные начинаются с в нижнем регистре буквы, такие как day, month и year. Читайте о них here

+0

О, теперь я вижу. Я просто использовал информацию из своего BMI-кодирования, поэтому может быть поэтому ... – ChrisD93

+0

Спасибо, что сработал. Кроме того, вы знаете что-нибудь о части DoB? Я пробовал делать Month = input.nextInt(); personalInfo.setBirthMonth ((INT) месяц); но не повезло:/ – ChrisD93

+0

См. обновление. Установите их одинаково, но не нужно бросать – Reimeus

1

Ваше исключение ясно говорит Exception in thread "main" java.lang.ArithmeticException:/by zero

Как вы можете видеть в своем собственном выходе, height является 0, поэтому, когда вы получаете ИМТ разделить на 0, который не является юридической операцией по адресу:

public double getBMI(){ 
    return (weight * 703)/(height * height); 
} 

Убедитесь, что вы полностью запускаете свою программу и вводите допустимую высоту. .

Кроме того, как @jlordo указал, что ваш код делает целочисленное деление (так как все значения, участвующие целые Это заставит вас потерять что-нибудь после запятой Попробуйте использовать:.

public double getBMI(){ 
    return ((double)weight * 703)/(height * height); 
} 

Вместо этого. Кастинг один из вовлеченных значений в double делает Java сохранить десятичные значения вокруг

+0

Вы также должны отметить, что этот код выполняет целочисленное деление, поэтому он всегда будет отсекать все после десятичной точки. – jlordo

+0

@jlordo Ах да. Не поймал это. Я отредактирую это в ответ –

0

в вашем следующем методе, изменить его на что-то вроде этого:.

public double getBMI(){ 
    if(height == 0) 
     return (weight * 703)/(height * height); 
    else 
     return x; // x is whatever the value you want 
} 
+1

Uh ...Это не решит проблему вообще –

+0

Посмотрите. Если и 'height' равно нулю, это снова вызовет исключение. Он должен выглядеть так: 'if (height! = 0) {return (weight * 703)/(height * height);} else {return x;}' –

+0

@ brano88 Я использую оператор 'OR', поэтому он будет не вызывать исключения снова – fujy

Смежные вопросы