OOP Fehlersuche

Maghrebi

Mitglied
Servus Leute,

ich brauch da mal eure Hilfe und hoffe ihr könnt mir weiter helfen. :)

Diesen Quelltext(Bild) haben wir von der Schule bekommen und müssen nun die Fehler beseitigen.
Ich habe absolut keine Ahnung wie ich bei so einer Meldung auf Fehlersuche gehe.

lg
 

Anhänge

  • Fehlermeldung.jpg
    Fehlermeldung.jpg
    91,6 KB · Aufrufe: 44
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
was ist Code überhaupt, hast du da keine Vorstellung?
wenn du mit den Schraubendreher ein Autorad anschrauben willst und das nur durchdreht weil keine Schraube im 'Schraubloch' sitzt,
fragst du dann auch Leute in einem Forum oder überlegst selber, warum sollte da eigentlich eine Schraube sitzen oder nicht, nimmst im Zweifel eine neue Schraube? ;)

jede NullPointerException sagt dir dass etwas nicht da ist, ignoriere es und setze ein neues Objekt hin oder schaue im Prozess nach wo denn eine gesetzt hätte sein sollen, wo der Fehler stattfindet (im realen Beispiel z.B. der Kollege der 2 Min. vorher am Rad hantierte)
 

KSG9|sebastian

Top Contributor
Es scheint auch als würden die Fragesteller von Tag zu Tag weniger Eigeninitiative zeigen.

Kleiner Tipp noch dazu...

Code:
String wert = null;

wert.indexOf("."); // BÄM! NullPointerException

...und jetzt übertrage dieses Beispiel in deinen Code und überlege dir wo das passieren könnte...
 
S

SlaterB

Gast
an deinem Code ist nicht zu erkennen was mit kunde los ist, kunde darf nicht null sein, ist aber null
 
P

pappawinni

Gast
Woher kommt denn der nicht existierende "Kunde"?
Warum postest du nicht die ganze Klasse?
 

Maghrebi

Mitglied
vielleicht hilft das hier weiter...es geht darum, dem kunden eine Gutschrift zu buchen (Zeile 56-59)

Java:
public class Kunde
{
	/**
	 * Name des Kunden
	 */
  private String name;

	/**
	 * Geschäftssitz des Kunden
	 */
  private String ort;

	/**
	 * das Konto des Kunden
	 */
  private Konto konto;
  
  /**
	 * neues Kundenobjekt erzeugen und Eröffnung seines Kontos mit voreingestellten Werten
	 */
  public Kunde( )
  {
  	konto = new Konto( );
  }
  
  public String getName( )
  {
  	return name;
  }
  public void setName( String name )
  {
  	this.name = name;
  }
  
  public String getOrt( )
  {
  	return ort;
  }
  public void setOrt( String ort )
  {
  	this.ort = ort;
  }

  public Konto getKonto( )
  {
  	return konto;
  }
  public void setKonto( Konto konto )
  {
  	this.konto = konto;
  }

  /**
	 * @post betrag wurde dem Konto des Kunden gutgeschrieben
	 */
  public void gutschrift( double betrag )
  {
  	konto.buchen( betrag );
  }

  /**
	 * @pre Konto des Kunden weist ausreichende Deckung auf
	 * @post betrag wurde vom Konto abgebucht
	 */
  public void abbuchen( double betrag )
  {
  	konto.buchen( -betrag );
  }

  /**
	 * @return Kontenstand des Kunden
	 */
  public double kontenstandAbfragen( )
  {
  	return konto.getStand( );
  }
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die Klasse Kunde steht bisher nicht in Verdacht,
es geht allein um die statische Variable kunde im ersten Code
 

Maghrebi

Mitglied
vielleicht stimmt hier was nicht :rtfm: (Zeile 91 - 98)

Java:
public class Konto
{
	/**
	 * Kontenstand
	 */
	private Double stand = 0.0;

  /**
	 * <P>Kreditlimit
	 * <BR>Weist ein Konto einen Sollsaldo auf,
	 * <BR>so ist dieser kleiner als das Kreditlimit.
	 */
  private Double kreditlimit;

  /**
	 * <P>Datum der Eröffnung eines Kontos
	 */
  private Date eroeffnungsdatum;

  /**
	 * Eröffnung eines Kontos mit voreingestelltem Kreditlimit und voreingestelltem Eröffnungsdatum
	 */
  public Konto( )
  {
  	kreditlimit( );
  	eroeffnungsdatum( );
  }
  
  public Double getStand( )
  {
  	return stand;
  }
    public void setStand( Double stand )
  {
  	this.stand = stand;
  }

  public Double getKreditlimit( )
  {
  	return kreditlimit;
  }
  public void setKreditlimit( Double kreditlimit )
  {
  	this.kreditlimit = kreditlimit;
  }

  /**
	* @post voreingestellter Wert des Kreditlimits ist Euro 5000,- .
	*/
  public void kreditlimit( )
  {
  	kreditlimit = 5000.0;
  }
  
	/**
	 * @return Eröffnungsdatum als Zeichenfolge; Format: 99.99.9999
	 */
	public String getEroeffnungsdatum( )
	{
	  DateFormat df = DateFormat.getDateInstance( );
		return df.format( eroeffnungsdatum );
	}
	
	/**
	 * @param eroeffnungsdatum Eröffnungsdatum als Zeichenfolge;  Format: 99.99.9999
	 */
	public void setEroeffnungsdatum( String eroeffnungsdatum )
	{
    try
    {
		  DateFormat df = DateFormat.getDateInstance( );
      this.eroeffnungsdatum = new Date( df.parse( eroeffnungsdatum ).getTime( ) );
    }
    catch ( ParseException e )
    {
    }
	}

	/**
	 * @post voreingestellter Wert des Eröffnungsdatums ist das aktuelle Tagesdatum
	 */
	public void eroeffnungsdatum( )
	{
		GregorianCalendar gc = new GregorianCalendar( );
		eroeffnungsdatum = new Date( gc.getTimeInMillis( ) );
	}
	
	/**
	 * @pre Konto weist ausreichende Deckung auf
	 * @post betrag wurde auf dem Konto verbucht
	 */
  public void buchen( double betrag )
  {
  	if ( deckungAusreichend( betrag ) )
  		stand += betrag;
  	else
  		System.out.println( "Buchung nicht möglich - Konto nicht ausreichend gedeckt.");
  }
  
  /**
	 * @return ob das Konto zur Verbuchung von betrag ausreichend gedeckt ist oder nicht
	 */
  public boolean deckungAusreichend( double betrag )
  {
  	return stand + betrag > -kreditlimit;
  }
}
 
P

pappawinni

Gast
Du hast doch in KundenkontoAnw
irgendwo die Zeile
kunde.gutschrift( eingabe.nextDouble());
jetzt ist die Frage, wo denn dieser Kunde erzeugt wird.
Zeig doch mal die main methode von KundenkontoAnw.
Von dort erfolgt offensichtlich der Aufruf der Methode gutschrift()
 
P

pappawinni

Gast
nee.. fällt mir gerade auf, da ist vor dem Scanner ein Warning..fehlt da vielleicht der Import?
import java.util.Scanner;

Was sagt denn Eclipse, wenn du mit der Maus mal vor Scanner auf die Warning zeigst ?
 
Zuletzt bearbeitet von einem Moderator:

Maghrebi

Mitglied
java.util.Scanner wurde importiert. In der warning steht folgendes: Resource leak: 'eingabe' is never closed.

Hier noch der Quelltext von einer dritten Klasse in dem sich main() befindet:
(main() beginnt ab Zeile 11, ich glaub kunde wird in Zeile 6 erzeugt, die Funktion gutschrift() worum es bei der Sache geht fängt in Zeile 99 an)


Java:
public class KundenkontoAnw
{
	/**
	 * der Kunde
	 */
	private static Kunde kunde;

	/**
	 * Hauptprogramm
	 */
	public static void main( String[ ] args )
	{
		boolean ende = false;
		int wahl;
		
    do
    {
    	wahl = menue( );
    	switch ( wahl )
    	{
    	  case 1:
    	  	neuerKunde( );
    	  	break;
    	  case 2:
    	  	gutschrift( );
    	  	break;
    	  case 3:
    	  	abbuchung( );
    	  	break;
    	  case 4:
    	  	kontenstandAbfragen( );
    	  	break;
    	  default:
    	  	beenden( );
    	  	ende = true;
    	}
    }
    while ( ! ende );
	}
	
	/**
	 * <P>Menü:
	 * <BR>1 - Angaben eines Kunden aufnehmen und Konto eröffnen
	 * <BR>2 - Überweisung eines Kunden gutschreiben
	 * <BR>3 - Betrag vom Konto abbuchen
	 * <BR>4 - Kontenstand abfragen
	 * <BR>0 - Ende
	 */
	public static int menue( )
	{
		System.out.println( );
    System.out.println( "Verwaltung des Kontos eines Kunden" );
    System.out.println( "----------------------------------" );
    System.out.println( );
		
		System.out.println( "1 - Angaben eines Kunden aufnehmen und Konto eröffnen" );
    System.out.println( "2 - Überweisung eines Kunden gutschreiben" );
    System.out.println( "3 - Betrag vom Konto abbuchen" );
    System.out.println( "4 - Kontenstand abfragen" );
    System.out.println( "0 - Ende" );
    System.out.println( );
    System.out.print( "Wahl: " );

    Scanner eingabe = new Scanner( System.in );
    return eingabe.nextInt( );
	}
	
	/**
	 * Angaben eines Kunden aufnehmen und Konto eröffnen
	 */
	public static void neuerKunde( )
	{
		String s;
		
    System.out.println( );
		System.out.println( "1 - Angaben eines Kunden aufnehmen und Konto eröffnen" );
    System.out.println( );

    kunde = new Kunde( );
    
    Scanner eingabe = new Scanner( System.in );
    System.out.print( "Name: " );
    kunde.setName( eingabe.nextLine( ) ); 
    System.out.print( "Ort : " );
    kunde.setOrt( eingabe.nextLine( ) ); 
    System.out.print( "Kreditlimit [ " + kunde.getKonto( ).getKreditlimit( ) + " ] : " );
    s = eingabe.nextLine( );
    if ( ! s.equals( "" ) )
      kunde.getKonto( ).setKreditlimit( new Double( s ) ); 
    System.out.print( "Datum [ " + kunde.getKonto( ).getEroeffnungsdatum( ) + " ] : " );
    s = eingabe.nextLine( );
    if ( ! s.equals( "" ) )
      kunde.getKonto( ).setEroeffnungsdatum( s ); 
  }

	/**
	 * Überweisung eines Kunden gutschreiben
	 */
	public static void gutschrift( )
	{
    System.out.println( );
		System.out.println( "2 - Überweisung eines Kunden gutschreiben" );
    System.out.println( );
   
    Scanner eingabe = new Scanner( System.in );
    System.out.print( "Betrag: " );
    kunde.gutschrift( eingabe.nextDouble() );
  }

	/**
	 * Betrag vom Konto des Kunden abbuchen
	 */
	public static void abbuchung( )
	{
    System.out.println( );
		System.out.println( "3 - Betrag vom Konto abbuchen" );
    System.out.println( );

    Scanner eingabe = new Scanner( System.in );
    System.out.print( "Betrag: " );
    kunde.abbuchen( eingabe.nextDouble( ) ); 
  }

	/**
	 * Kontenstand abfragen
	 */
	public static void kontenstandAbfragen( )
	{
    System.out.println( );
		System.out.println( "4 - Kontenstand abfragen" );

    System.out.printf( "\nKontenstand: %12.2f", kunde.kontenstandAbfragen( ) );
    System.out.println( );
  }

	/**
	 * Ausführung des Programms beenden
	 */
	public static void beenden( )
	{
    System.out.println( );
		System.out.println( "0 - Ende" );
    System.out.println( );
  }
}
 
S

SlaterB

Gast
in Zeile 6 wird nur eine Variable deklariert, wie ein Parkplatz ohne Auto drauf,

die Methode neuerKunde( ) sorgt für einen Kunden,
ob du gutschrift( ); ohne bzw. vor neuerKunde( ); ausführst, nach Benutzereingabe, ist wie alles nicht zu erkennen,
nicht von dir gesagt, alles muss man nachfragen

ein Code der von Benutzereingaben abhängt, hat offensichtlich ohne genaue Dokumentation der Eingaben nicht komplette Aussagekraft


ist es so schwer mitzudenken? nun, dann hoffentlich in diesem Fall gut lernen,
die Variable kunde ist leer, deswegen Fehler,
das ist wirklich schon alles, nichts was einem nicht täglich begegnen wird, 3 Min. Bearbeitung dauert
 

Maghrebi

Mitglied
Danke für eure antworten und nein es ist nicht so schwer mit zu denken ich weiß nur nicht wie ich kunde einen Wert zuweise, mit kunde = 0.0; gehts ja nicht
 

Maghrebi

Mitglied
OK, hab das Programm zum laufen gebracht

vorher sah es so aus:
Java:
private static Kunde kunde;

und nun siehts so aus:
Java:
private static Kunde kunde = new Kunde();

kann man das Problem so lösen?
 
S

SlaterB

Gast
> ich weiß nur nicht wie ich kunde einen Wert zuweise

mit
> kunde = new Kunde( );
geht das, wie es in der Methode neuerKunde( ) das zentrale Thema ist!
wie es in deinem Hauptmenü einer von 4-5 Möglichkeiten überhaupt im Programm

ohne irgendwie hämisch zu sein läßt diese Nachfrage auch wieder schwer am Verständnis zweifeln,
was sollte
> kunde = 0.0;
denn bringen?

du brauchst doch ein Objekt der Klasse Kunde, du willst doch dessen interne Dinge, name, konto, double kontostand, Methoden usw. nutzen..


in diesem Fall musst du doch nichtmal so sehr in Java-Dingen denken, allein schon das Hauptmenü
Java:
    System.out.println( "1 - Angaben eines Kunden aufnehmen und Konto eröffnen" );
    System.out.println( "2 - Überweisung eines Kunden gutschreiben" );
    System.out.println( "3 - Betrag vom Konto abbuchen" );
    System.out.println( "4 - Kontenstand abfragen" );
legt doch nahe, dass man erstmal mit Menüpunkt 1 einen Kunden anlegen,
wohin sollte etwas überwiesen werden sonst?

edit:
> kann man das Problem so lösen?

die fragliche Fehlermeldung womöglich, wobei richtige Bedienung (erst Kundeneingabe) auch ginge,
Verständnis für Vorgänge ist unerläßlich,
eine Fernbedienung macht auch nix bevor man nicht den Fernseher einschaltet
 

Neue Themen


Oben