Fitness-Rechner: NullPointerException

moshpit

Mitglied
Hallo Community,

ich melde mich mal wieder wegen einer etwas umfangreicheren Aufgabe (zumindest für meine Verhältnisse). Geschrieben werden soll ein Fitness-Rechner, der Daten zur Person erfasst, was sie gegessen hat (Tabelle nach Vorgabe) und einen Trainingsplan aufstellt.

So weit bin ich schon:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;


public class FitnessCalc {
	
	private static int listofdata[];
	private static int dauer[];
	
	/**
	public FitnessCalc() throws IOException{
		Datenmaske();
	}
	 * @throws IOException **/
	
	//Methode Hauptmenü
	public static void Hauptmenue() throws IOException {
	BufferedReader main_menu = new BufferedReader (new InputStreamReader(System.in));
	Scanner main_choice = new Scanner (System.in);
	try{
	System.out.println("=====================================================");
	System.out.println("                     HAUPTMENÜ                  ");
	System.out.println("=====================================================");
	System.out.println("             IHRE OPTIONEN:");
	System.out.println();
	System.out.println("             1. Eigene Daten eingeben");
	System.out.println("             2. Berechnung starten");
	System.out.println("             3. Programm beenden");
	System.out.println("=====================================================");
	int auswahl_main = main_choice.nextInt();
	
	System.out.println();
	
	switch (auswahl_main) {
	case 1: 
		Datenmaske();
		break;
	case 2:
		Konsum();
		break;
	case 3:
		System.out.println("=====================================================");
		System.out.println("           *** Programm wird beendet! ***");
		System.out.println("_____________________________________________________");
		break;
	default: 
		System.out.println("=====================================================");
		System.out.println("        *** Bitte richtige Eingabe machen ***");
		System.out.println("_____________________________________________________");
		try {
			Hauptmenue();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		break;
	}
	}catch (InputMismatchException e){
		System.out.println("Fehler! Programm wird neu gestartet!");
		Hauptmenue();
	}
}
	

	
	//Methode für Dateneingabe
	public static int[] Datenmaske() throws IOException{
		int[] listofdata = new int[4];
		int gender=0;
		Scanner datainput = new Scanner (System.in);
		BufferedReader data = new BufferedReader (new InputStreamReader(System.in));
		System.out.println("=====================================================");
		System.out.println("            *** Starte Datenmaske... ***");
		System.out.println("_____________________________________________________");
		System.out.println();
		System.out.println("1. Bitte geben Sie ihr Gewicht in Kilogramm (kg) an: ");
		int gewicht = datainput.nextInt();
		System.out.println("2. Bitte geben Sie ihr Alter in Jahren an: ");
		int alter = datainput.nextInt();
		System.out.println("3. Bitte geben Sie ihre Körpergröße \nin Zentimetern (ohne Nachkommastellen) an: ");
		int groesse = datainput.nextInt();
		System.out.println("4. Bitte geben Sie ihr Geschlecht an (m / w): ");
		char geschlecht = (char) data.read();
		switch (geschlecht){
		case 'm':
			gender = 1;
			break;
		case 'w':
			gender = 2;
			break;
		}
		listofdata[0]=gewicht;
		listofdata[1]=alter;
		listofdata[2]=groesse;
		listofdata[3]=geschlecht;
		
		System.out.println();
		System.out.println("Sie haben angegeben: \nGewicht: " + gewicht + " kg \nAlter: " + alter + " Jahre \nGröße: " + groesse + " cm \nGeschlecht: " + gender);
		System.out.println();
		System.out.println("Wollen Sie die Konsumermittlung starten?");
		System.out.println("1. JA");
		System.out.println("2. NEIN");
		int start = datainput.nextInt();
		switch (start){
		case 1:
			Konsum();
		case 2:
			Hauptmenue();
		default: 
			Datenmaske();
		}
		datainput.close();
	
		return listofdata;
	}
	
	
	
	//
	//Methode für Konsumermittlung
	public static int[] Konsum() throws IOException{
		Scanner calc = new Scanner(System.in);
		System.out.println("=====================================================");
		System.out.println("            *** Starte Calculator... ***");
		System.out.println("_____________________________________________________");
		System.out.println("Bitte geben Sie an, wieviel von welcher \nder folgenden Lebensmittel Sie gegessen haben: ");
		System.out.println();
		System.out.println("a. Glühwein (1 Tasse): ");
		int gluehwein = calc.nextInt();
		System.out.println("b. Lebkuchen (1 Stück): ");
		int lebkuchen = calc.nextInt();
		System.out.println("c. Portion Heiße Maronen (100g): ");
		int maronen = calc.nextInt();
		System.out.println("d. Portion Gebrannte Mandeln (100g): ");
		int mandeln = calc.nextInt();
		System.out.println("e. Spekulatious (1 Stück): ");
		int spekulatius = calc.nextInt();
		System.out.println("Sie haben folgende Angaben gemacht: " +
				"\nGlühwein: " + gluehwein + " Tassen" +
					"\nLebkuchen: " + lebkuchen + " Stück" +
						"\nMaronen: " + (maronen*100) + " Gramm" +
							"\nMandeln: " + (mandeln*100) + " Gramm\n" +
								"Spekulatius: " + spekulatius + " Stück");
		System.out.println();
		System.out.println("Bitte geben Sie ihre Trainigsdauer (in Stunden) an: ");
		System.out.println("1. Crosstrainer: ");
		int dauer_cross = calc.nextInt();

		System.out.println("2. Stepper: ");
		int dauer_step = calc.nextInt();
		
		System.out.println("3. Laufband: ");
		int dauer_lauf = calc.nextInt();
		calc.close();

		int [] dauer = new int[3];
		dauer[0] = dauer_cross;
		dauer[1] = dauer_step;
		dauer[2] = dauer_lauf;
		
		switch (listofdata[3]){
		//MÄNNER
		case 109:
			CalcMen();
			break;
		//FRAUEN
		case 119:
			CalcWomen();
			break;
		}
		return dauer;
		
	}
	
	//
	//Methode für Berechnung Frauen
	public static double[] CalcWomen(){
		double[] berechnet_w = new double[3];
		double stepper = 8.3;
		double crosstrain = 7.9;
		double lauf = 7.7;
		
		//Crosstrainerberechnung Männer
				double cross_kcal_m = 0;
				cross_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (5 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[0] / 24) * (crosstrain - 1));
				berechnet_w[0] = cross_kcal_m;
				
				//Stepperberechnung für Männer
				double step_kcal_m = 0;
				step_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (1.8 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[1] / 24) * (stepper - 1));
				berechnet_w[1] = step_kcal_m;
				
				//Laufbandberechnung für Männer
				double  lauf_kcal_m = 0;
				lauf_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (5 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[2] / 24) * (lauf - 1));
				berechnet_w[2] = lauf_kcal_m;
				
				
				try {
					Hauptmenue();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			return berechnet_w;
	}
	
	
	//
	//Methode für Berechnung Männer
	public static double[] CalcMen(){
		double[] berechnet_m = new double[3];
		double stepper = 8.3;
		double crosstrain = 7.9;
		double lauf = 7.7;
		
		//Crosstrainerberechnung Männer
				double cross_kcal_m = 0;
				cross_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (5 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[0] / 24) * (crosstrain - 1));
				berechnet_m[0] = cross_kcal_m;
		
		//Stepperberechnung für Männer
				double step_kcal_m = 0;
				step_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (1.8 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[1] / 24) * (stepper - 1));
				berechnet_m[1] = step_kcal_m;
		
		//Laufbandberechnung für Männer
				double  lauf_kcal_m = 0;
				lauf_kcal_m = ((66.47 + (13.7 * listofdata[0]) + (5 * listofdata[2]) - (6.8 * listofdata[1])) * (dauer[2] / 24) * (lauf - 1));
				berechnet_m[2] = lauf_kcal_m;
	
		return berechnet_m;
	}

	//Hauptprogramm mit UI
	public static void main(String[] args) {
		FitnessCalc fc = new FitnessCalc();

		System.out.println("*****************************************************");
		System.out.println("       WILLKOMMEN BEI IHREM FITNESS-CALCULATOR  ");
		System.out.println("*****************************************************");
		try {
			Hauptmenue();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
}
}

Hier passiert beim Ausführen der Methode "Konsum" nach Eingabe der Werte über die Konsole nach dem letzten Wert folgendes:

Exception in thread "main" java.lang.NullPointerException
at FitnessCalc.Konsum(FitnessCalc.java:166)
at FitnessCalc.Datenmaske(FitnessCalc.java:111)
at FitnessCalc.Hauptmenue(FitnessCalc.java:41)
at FitnessCalc.main(FitnessCalc.java:249)

Eigentlich sollte die Methode dann die entsprechende Methode CalcMen/CalcWomen aufrufen, wenn in listofdata[3] der Wert 1(=männlich) oder 2(=weiblich) hinterlegt ist.


Ich komm nich drauf, was da falsch läuft! Someone out there to help me out? 😉

Schonmal vielen Dank!
 
Zuletzt bearbeitet:
Die Fehlermeldung zeigt Dir ja in welcher Zeile der Fehler auftritt.
Das ganze statische ist mehr als unschön, sowas kann man mal für kleinere Tests machen.

Das Problem liegt bei
Code:
listofdata
die Variable ist vermutlich nicht initialisiert. In
Code:
Datenmaske()
wird eine lokale Variable mit dem selben Namen verwendet. Diese wird auch zurückgegeben aber nirgends "angenommen" bzw. zugewiesen.
 
Hallo Michael...

Vielen Dank für deine schnelle Antwort!
Wie "nehme" ich denn diese Variable an bzw. wie weise ich sie zu? Eigentlich soll das Array listofdata[] in der Methode Datenmaske() gefüllt werden und dann global zur Verfügung stehen, um in jeder Methode darauf zurückgreifen zu können. Ist das irgendwie machbar? Hab beim heiligen Orakel & Konsorten leider nichts brauchbares entdecken können 🙁



P.S.
Man sollte vlt dazu sagen, dass ich Wirtschaftsinformatikstudent im ersten Semester bin 🙂
 
Zuletzt bearbeitet:
Man sollte vlt dazu sagen, dass ich Wirtschaftsinformatikstudent ... bin
Ob das eine gute Idee war ;-)

Grundsätzlich (Wenn der Anwender nicht erst "2" vor "1" drückt) sollte es schon funktionieren, wenn Du in
Code:
Datenmaske()
direkt die "globale" Variable verwendest und in deren ersten Zeile einfach das
Code:
int[]
vor
Code:
listofdata
, das return am Ende der Methode kannst Du Dir dann sparen und die Methode void machen.
 
Das liegt daran, dass du dein int array erst in der Methode Datenmaske erstellst. Vorher isses null. Genau die Art von Fehler entsteht wenn man globale static Variablen benutzt.
 
Das liegt daran, dass du dein int array erst in der Methode Datenmaske erstellst. Vorher isses null. Genau die Art von Fehler entsteht wenn man globale static Variablen benutzt.

Was wäre denn eine elegantere Lösung, um die Variablen global für alle Methoden zugänglich zu machen? Wenn ich das Array nur in
Java:
 Datenmaske()
initialisiere, wird in anderen Methoden bei Zugriffsversuch auf die Variable eine Fehlermarkierung angegeben.

Ich hab noch nich so den Überblick über die spezielle Herangehensweise in Java, aber ich will lernen :rtfm:
 
Du kannst das Array per Parameter an deine Konsum Methode übergeben:
Java:
public static int[] Konsum(int[] listOfData){...
Ausserdem wirst du wohl bei deiner Struktur um eine listOfData==null Prüfung nicht herumkommen.
 

Zurück
Oben