Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem

Unkreativich

Mitglied
Hallo zusammen,

ich habe folgendes Problem: Wenn ich WaehrungsrechnerMain.java kompilieren möchte, findet der Kompiler die Variable "waehrung" in der Methode *schreibeUmrechnungen* (Zeile 30) nicht. (Folgender Error wird ausgegeben (für insgesamt 17 verschiedene Zeilen)):

WaehrungsrechnerMain.java:58: error: cannot find symbol
waehrung.liefereAusgangsWaehrung());
^
symbol: variable waehrung
location: class WaehrungsrechnerMain

Ich habe folgende Lösungsansätze schon erfolglos ausprobiert:

1. Benutze einen weiteren Parameter für die Methode (Zeile 30 im gesamten Code):
[JAVA=30]schreibeUmrechnungen(double geldbetrag, Waehrungsrechner[] waehrung)[/code]
Das funktioniert auch soweit, nur dass ich dann in der Aktivierung der Methode bei *main* (Zeile 12)
[JAVA=12]schreibeUmrechnungen(derGeldbetrag);[/code]
in Probleme gerate, da ein weiterer Parameter gefordert wird.

2. Ich habe versucht mit *get* die Variable zu holen, d.h. in der *schreibeUmrechnungen* Methode vor der
*for*-Schleife (Zeile 31) noch hinzugefügt:
Java:
WaehrungsrechnerMain.get(waehrung);
In diesem Fall erkannte der Kompiler die Variable auch nicht.

Ich stehe also ein bisschen auf dem Schlau, insbesondere, weil ich noch nicht häufig mit Arrays programmiert habe. (Eventuell liegt da auch genau die Lösung des Problems, nämlich, dass der Kompiler nicht erkennt, dass es sich bei "waehrung" um einen Array handelt.)
Ich hoffe, Ihr habt bessere Ideeen als ich. Danke schon einmal im Voraus 🙂 Und hier natürlich der Quellcode:

Java:
public class WaehrungsrechnerMain
{
  private WaehrungsrechnerMain()
  {
  }

  public static void main(String[] args)
  {
    System.out.format("%n Test eines Waehrungsrechners %n");
    String dieEingabeAufforderung = "Welcher Betrag soll umgerechnet werden?   ";
    double derGeldbetrag = MeineEingabe.erfasseDouble(dieEingabeAufforderung);
    schreibeUmrechnungen(derGeldbetrag);
   }
  
  private static Waehrungsrechner[] erzeugeWaehrungsRechner(Waehrungsrechner[] 
							  rechner) 
  {
    Waehrungsrechner[] waehrung = new Waehrungsrechner[6];  //waehrung blöd

    waehrung[0] = new Waehrungsrechner("Euro", "US-Dollar", 1.39);
    waehrung[1] = new Waehrungsrechner("Euro", "British Pound", 0.83);
    waehrung[2] = new Waehrungsrechner("Euro", "CanadianDollar", 1.55);
    waehrung[3] = new Waehrungsrechner("US-Dollar", "BritishPound", 0.6);
    waehrung[4] = new Waehrungsrechner("BritishPound", "CanadianDollar", 1.85);
    waehrung[5] = new Waehrungsrechner("CanadianDollar", "US-Dollar", 0.89);
    
    return waehrung;
  }

  private static void schreibeUmrechnungen(double geldbetrag)
  {
    for (int i = 0; i < waehrung.length; i++)
    {
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag);
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag);
      
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag);
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag);

      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      waehrung[i].liefereAusgangsWaehrung(),
      waehrung[i].liefereKursVonAusgangsInZielWaehrung(), 
      waehrung[i].liefereZielWaehrung());
	
      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      waehrung[i].liefereZielWaehrung(), 
      waehrung[i].liefereKursVonZielInAusgangsWaehrung(), 
      waehrung[i].liefereAusgangsWaehrung());
    
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2s %4$s", 
      geldbetrag, waehrung[i].liefereAusgangsWaehrung(), 
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag), 
      waehrung[i].liefereZielWaehrung());
	  
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2f %4$s", 
      geldbetrag, waehrung[i].liefereZielWaehrung(), 
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag), 
      waehrung[i].liefereAusgangsWaehrung());
	
      System.out.format("%n");  	  
    }
  }
}
 
naja, du musst ganz einfach
Code:
Waehrungsrechner[] waehrung
global, also außerhalb einer Methode deklarieren, da ansonsten ja nur in dieser einen Methode bekannt.
 
Zuletzt bearbeitet:
Hallo qwert,

danke für deine Hilfe 🙂 Ich habe, deiner Antwort folgend und nach einigen Hilfen durch den Compiler (Waehrungsrechner[] waehrung soll seiner Meinung nach static sein, damit es von der static-Methode *erzeugeWaehrungsrechner* aufgerufen werden kann) das Programm nun wie folgt geschrieben:

Java:
public class WaehrungsrechnerMain
{
  public static Waehrungsrechner[] waehrung;
  
  private WaehrungsrechnerMain()
  {	
  } 

  public static void main(String[] args)
  {
    System.out.format("%n Test eines Waehrungsrechners %n");
    String dieEingabeAufforderung = "Welcher Betrag soll umgerechnet werden?   ";
    double derGeldbetrag = MeineEingabe.erfasseDouble(dieEingabeAufforderung);
    schreibeUmrechnungen(derGeldbetrag);
   }
  
  private static Waehrungsrechner[] erzeugeWaehrungsRechner(Waehrungsrechner[] 
							    rechner) 
  {
    Waehrungsrechner[] waehrung = new Waehrungsrechner[6];  //waehrung blöd

    waehrung[0] = new Waehrungsrechner("Euro", "US-Dollar", 1.39);
    waehrung[1] = new Waehrungsrechner("Euro", "British Pound", 0.83);
    waehrung[2] = new Waehrungsrechner("Euro", "CanadianDollar", 1.55);
    waehrung[3] = new Waehrungsrechner("US-Dollar", "BritishPound", 0.6);
    waehrung[4] = new Waehrungsrechner("BritishPound", "CanadianDollar", 1.85);
    waehrung[5] = new Waehrungsrechner("CanadianDollar", "US-Dollar", 0.89);
    
    return waehrung;
  } 

  private static void schreibeUmrechnungen(double geldbetrag)
  {   
    for (int i = 0; i < waehrung.length; i++)
    {
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag);
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag);
      
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag);
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag);

      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      waehrung[i].liefereAusgangsWaehrung(),
      waehrung[i].liefereKursVonAusgangsInZielWaehrung(), 
      waehrung[i].liefereZielWaehrung());
	
      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      waehrung[i].liefereZielWaehrung(), 
      waehrung[i].liefereKursVonZielInAusgangsWaehrung(), 
      waehrung[i].liefereAusgangsWaehrung());
    
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2s %4$s", 
      geldbetrag, waehrung[i].liefereAusgangsWaehrung(), 
      waehrung[i].rechneBetragInZielWaehrung(geldbetrag), 
      waehrung[i].liefereZielWaehrung());
	  
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2f %4$s", 
      geldbetrag, waehrung[i].liefereZielWaehrung(), 
      waehrung[i].rechneBetragInAusgangsWaehrung(geldbetrag), 
      waehrung[i].liefereAusgangsWaehrung());
	
      System.out.format("%n");  	  
    }
  }
}

Also keine großen Veränderungen, bis auf die Deklaration des Attributes am Anfang. Der Code wird nun auch kompiliert, jedoch erhalte ich folgende Nachricht beim Ausführen:

Test eines Waehrungsrechners
Welcher Betrag soll umgerechnet werden? 12
Exception in thread "main" java.lang.NullPointerException
at WaehrungsrechnerMain.schreibeUmrechnungen(WaehrungsrechnerMain.java:34)
at WaehrungsrechnerMain.main(WaehrungsrechnerMain.java:14)

Ich denke, dass liegt daran, dass das Attribut Waehrungsrechner[] waehrung auf default-Wert Null gesetzt wird. Ich habe auch schon probiert, die Methode *erzeugeWaehrungsrechner* als Konstruktor zu schreiben, damit das Attribut richtig initialisiert wird. Auch dies funktionierte leider nicht.

Irgendwelche anderen Ideeen?
 
Genial :idea::toll::toll: Vielen, vielen Dank an Euch!
Ich hab es jetzt so gemacht und es funktioniert (für die, die es interessiert):

Java:
public class WaehrungsrechnerMain
{
  public static Waehrungsrechner[] waehrung;
  
  private WaehrungsrechnerMain()
  {	
  } 

  public static void main(String[] args)
  {
    System.out.format("%n Test eines Waehrungsrechners %n");
    String dieEingabeAufforderung = 
    " Welcher Betrag soll umgerechnet werden? ";
    double derGeldbetrag = MeineEingabe.erfasseDouble(dieEingabeAufforderung);
    schreibeUmrechnungen(derGeldbetrag);
   }
  
  private static Waehrungsrechner[] erzeugeWaehrungsRechner() 
  {
    Waehrungsrechner[] waehrung = new Waehrungsrechner[6];  //waehrung blöd

    waehrung[0] = new Waehrungsrechner("Euro", "US-Dollar", 1.39);
    waehrung[1] = new Waehrungsrechner("Euro", "British Pound", 0.83);
    waehrung[2] = new Waehrungsrechner("Euro", "CanadianDollar", 1.55);
    waehrung[3] = new Waehrungsrechner("US-Dollar", "BritishPound", 0.6);
    waehrung[4] = new Waehrungsrechner("BritishPound", "CanadianDollar", 1.85);
    waehrung[5] = new Waehrungsrechner("CanadianDollar", "US-Dollar", 0.89);

    return waehrung;
  } 

  private static void schreibeUmrechnungen(double geldbetrag)
  {   
    Waehrungsrechner[] rechnung = 
				WaehrungsrechnerMain.erzeugeWaehrungsRechner();
    
    for (int i = 0; i < rechnung.length; i++)
    {
      rechnung[i].rechneBetragInZielWaehrung(geldbetrag);
      rechnung[i].rechneBetragInAusgangsWaehrung(geldbetrag);
      
      rechnung[i].rechneBetragInZielWaehrung(geldbetrag);
      rechnung[i].rechneBetragInAusgangsWaehrung(geldbetrag);

      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      rechnung[i].liefereAusgangsWaehrung(),
      rechnung[i].liefereKursVonAusgangsInZielWaehrung(), 
      rechnung[i].liefereZielWaehrung());
	
      System.out.format("%n Kurs:    1.00 %1$-20s = %2$20.2f %3$s", 
      rechnung[i].liefereZielWaehrung(), 
      rechnung[i].liefereKursVonZielInAusgangsWaehrung(), 
      rechnung[i].liefereAusgangsWaehrung());
    
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2s %4$s", 
      geldbetrag, rechnung[i].liefereAusgangsWaehrung(), 
      rechnung[i].rechneBetragInZielWaehrung(geldbetrag), 
      rechnung[i].liefereZielWaehrung());
	  
      System.out.format("%n         %1$.2f %2$-20s = %3$20.2f %4$s", 
      geldbetrag, rechnung[i].liefereZielWaehrung(), 
      rechnung[i].rechneBetragInAusgangsWaehrung(geldbetrag), 
      rechnung[i].liefereAusgangsWaehrung());
	
      System.out.format("%n");  	  
    }
  }
}

Danke nochmal und liebe Grüße,
Unkreativich
 

Zurück
Oben