fehlermeldung heap space, endlosschleife???

Status
Nicht offen für weitere Antworten.

VirgelZimble

Mitglied
Hallo,

ich habe mir ein kleines programm zusammen geschrieben, wo man einzeln das geburtsdatum und das heutige datum eingibt, also für 20.06.1987 dann 20 6 und 1987 und dann errechnet wieviele Tage man bis jetzt gelebt hat.

Meine fehlermeldung sieht so aus:
Code:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.lang.Integer.valueOf(Unknown Source)
	at tagesrechner.Tagesrechner.main(Tagesrechner.java:55)


habe herraus gefunden dass der hepa speicher zu voll ist, vermute durch eine unbeabsichtigte endlosschleife... abe rich komme beim besten willen nicht drauf wo 🙁

von zeile 51 bis 55 steht folgendes:
Code:
	/* wird hochgezählt bis zum heutigen Jahr und gespeichert */
	ArrayList yearList = new ArrayList();
	while(year != yearToday)
	{   year = year ++;
	    yearList.add(year);}

mein kompletter code sieht wie folgt aus:

Code:
package tagesrechner;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Tagesrechner {
	
	public static void main(String argv[]) throws IOException
	{
	
	String str;	
	int day;
	int month;
	int year;
	int dayToday;
	int monthToday;
	int yearToday;
	
	
	
	/* Das Geburtsdatum wird eingegeben und entsprechend gespeichert */
	BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	System.out.print("Geben Sie den Tag Ihres Geburtsdatums ein:");
	str = input.readLine();
	day = Integer.parseInt(str);
	
	System.out.print("Geben Sie den Monat 'Ihres Geburtsdatums ein:");
	str = input.readLine();
	month = Integer.parseInt(str);
	
	System.out.print("Geben Sie das Jahr Ihres Geburtsdatums ein:");
	str = input.readLine();
	year = Integer.parseInt(str);
	
	/* Das heutige Datum wird eingegeben und entsprechend gespeichert */
	System.out.print("Geben Sie den aktuellen Tag an");
	str = input.readLine();
	dayToday = Integer.parseInt(str);
	
	System.out.print("Geben Sie den aktuellen Monat an");
	str = input.readLine();
	monthToday = Integer.parseInt(str);
	
	System.out.print("Geben Sie das aktuelle Jahr an");
	str = input.readLine();
	yearToday = Integer.parseInt(str);
	
	/* wird hochgezählt bis zum heutigen Jahr und gespeichert */
	ArrayList yearList = new ArrayList();
	while(year != yearToday)
	{   year = year ++;
	    yearList.add(year);} 
	
	/* es wird nachgesehen ob ein Schaltjahr vorhanden war */
	ArrayList schaltjahr = new ArrayList();
	for (int i = 0; i < yearList.size(); i++)
	   {
	    yearList.get(i); 
	     if ( i%400 == 0 || (i%4 == 0 && i%100 != 0))
	       { schaltjahr.add(1);
	       }
	   }
	
	/* Definition Schaltjahr und normales Jahr der Monate */
	int schaltjahrTage = 366;
	int jahrTage = 365;
	int schaltjahrFebruar = 29;
	int januar = 31;
	int februar = 28;
	int märz = 31;
	int april = 30;
	int mai = 31;
	int juni = 30;
	int juli = 31;
	int august = 31;
	int september = 30;
	int oktober = 31;
	int november = 30;
	int dezember = 31;
	
	/* Berechnung der Tage des Geburtsmonats */
	int monatTag = 0;
	switch(month)
	{ 
	case 1: monatTag = januar - day;
	case 2: if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
	          { monatTag = schaltjahrFebruar - day;
	          }
	        else { monatTag = februar - day;
	             }
	case 3: monatTag = märz - day;
	case 4: monatTag = april - day;
	case 5: monatTag = mai - day;
	case 6: monatTag = juni - day;
	case 7: monatTag = juli - day;
	case 8: monatTag = august - day;
	case 9: monatTag = september - day;
	case 10: monatTag = oktober - day;
	case 11: monatTag = november - day;
	case 12: monatTag = dezember - day;
	}
	
	/* Definition der Monate eines Jahres */
	int jahr = 12;
	int januarJ = 1;
	int februarJ = 2;
	int märzJ = 3;
	int aprilJ = 4;
	int maiJ = 5;
	int juniJ = 6;
	int juliJ = 7;
	int augustJ = 8;
	int septemberJ = 9;
	int oktoberJ = 10;
	int novemberJ = 11;
	int dezemberJ = 12;
	
	/* Berechnung der Monate im Geburtsjahr */
	int jahrMonat = 0;
	jahrMonat = jahr - month;
	
	/* Berechnung der Jahre in Tagen */
	int jahre = yearList.size();
	int schaltjahre = schaltjahr.size();
	int jahreK = 0;
	int jahreC = 0;
	int jahreS = 0;
	int jahreKomplett = 0;
	int jahreA = 0;
	jahreK = jahre - schaltjahre;
	jahreC = jahreK * 365;
	jahreS = schaltjahre * 366;
	jahreKomplett = jahreC + jahreS;
	if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
	{ jahreA = jahreKomplett - 366;
	}
	else
	{ jahreA = jahreKomplett - 365;
	}
	
	/* Berechnen der übrigen Tage im Geburtsjahr */
	int monat = 0;
	int jahrB = 0;
	switch(month)
	{ case 1: if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
		         {jahrB = monatTag + 335; }
	          else {jahrB = monatTag + 334;}
	  case 2: jahrB = monatTag + 306;
	  case 3: jahrB = monatTag + 275;
	  case 4: jahrB = monatTag + 244;
	  case 5: jahrB = monatTag + 214;
	  case 6: jahrB = monatTag + 183;
	  case 7: jahrB = monatTag + 152;
	  case 8: jahrB = monatTag + 122;
	  case 9: jahrB = monatTag + 91;
	  case 10: jahrB = monatTag + 61;
	  case 11: jahrB = monatTag + 30;
	  case 12: jahrB = 31 - monatTag;
	}
	
	/* Berechnen der übrigen Tage im aktuellen Jahr */
	int jahrC = 0;
	if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
			{ jahrC = 366 - jahrB;
			}
	else { jahrC = 365 - jahrB;
	     }
	
	/* zusammenfügen aller berechnungen */
	int komplettesJahr = 0;
	komplettesJahr = jahrC + jahrB + jahreA;
	System.out.println("Sie haben bisher "+komplettesJahr+" Tage gelebt.");
	
	}}


vielleicht kann mir ja jemand helfen, was ich da falsch gemacht hab 🙁
wäre superdankbar 🙂

Lg,
denise
 
Hobbit_Im_Blutrausch hat gesagt.:
Du erhöhst "year" niemals.

Erhöht wird year zwar, danach aber sofort wieder auf den
ursprünglichen Wert zurückgesetzt:

Code:
year = year ++;
year++ erhöht zuerst year, die Zuweisung weist
year aber gleich danach den Wert zu, den es
vor der Erhöhung hatte.

Einfach nur
Code:
year++;
ohne Zuweisung schreiben.
 
Ich nehme mal an, dass Dein Projekt der Übung dient. In der Praxis kannst Du Dir das Leben natürlich einfach machen, wenn Du die von Java bereit gestellten Datumsklassen (Date, Calendar) benutzt. Das könnte dann etwa so aussehen:
Code:
import java.io.*;
import java.text.*;
import java.util.*;

public class TageBisHeute {
	
	public static void main(String[] args) {
		
		final long MILLISECONDS_PER_DAY = 86400000L;
		
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("Datum (DD.MM.JJJJ): ");
		try {
			String input = reader.readLine();
			if (input != null) {				
				DateFormat df = DateFormat.getDateInstance();		
				Date d = df.parse(input);		
				System.out.printf("Tage bis heute: %d%n", 
						(new Date().getTime() - d.getTime()) / MILLISECONDS_PER_DAY);							
			}
		}
		catch (IOException e) {
			System.err.println(e.getMessage());
		}
		catch (ParseException e) {
			System.err.println(e.getMessage());
		}
	}
}
 
joa ^^, mein freund hatte das für c# als übung und ich dachte mir ich mach das mal mit java. die datefunktion durfte man dafür nicht benutzen 😉

danke für eure hilfe 🙂 hab da jetzt ne for-schleife draus gemacht und jetzt klappts.

Lg,
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben