Java: Ausgabe eines Methoden-Returns in einer System.out.println

Crageth

Ensign
Registriert
Sep. 2014
Beiträge
139
Hey Leute, zuallererst, ja ich bin ein ziemlicher Anfänger und ja, ich mache das gerade für mein Studium.

Ich benutze Netbeans IDE 8.2

Mein Problem:
Ich bekomme 2 Datumsangaben und soll diese dann von Tag-Monat-Jahr nur in die Anzahl der Tage ändern.
Nun soll ich die Differenz der beiden Zahlen berechnen und später ausgeben.

Ich habe nun eine Methode namens gibDifferenz() erstellt.

Ich möchte in meiner Main Methode nun das return der gibDifferenz() ausgeben und habe einfach
Systen.out.println (gibDifferenz()); versucht, allerdings ohne Erfolg.
Fehlermeldung: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - non-static method gibDifferenz() cannot be referenced from a static context

Da ich das in den verschiedenen Ausgaben schon mit teilen einer anderen Methode (d1.inTage()) gemacht habe und mein Ergebnis bekommen habe, habe ich darauf gehofft, dass es auch so geht.

Mein Code: https://pastebin.com/UvLVvRXA
 
Wie schon die Fehlermeldung sagt, du versuchst eine nicht statische Methode aufzurufen...
Die Methode statisch machen sollte das Problem lösen.
Code:
public static int gibDifferenz(){...
Edit: Ich würde mir aber mal das Thema "static" durchlesen.
 
Nein das wird das Problem nicht lösen, da d1 und d2 keine statischen Variablen sind. Auf jeden Fall solltest Du Dir nochmal anschauen, was mit static, Klassen, Objekten und Methodenaufrufen auf sich hat.

Code:
public int gibDifferenz(Datum d){
       
       return this.inTage() - d.inTage();
       
 }

könnte es heissen. Dann muss Du die Aufrufe in der main noch ändern.

Alternativ
Code:
public static int gibDifferenz(Datum d1, Datum d2){
       
       return d1.inTage() - d2.inTage();
       
 }

Und ebenfalls die main etwas anpassen.
 
Ha, okay danke, ein Problem gelöst.
Nun sagt er mir aber Erroneous sym type: d1.inTage in der folgenden Zeile an:

return d1.inTage() - d2.inTage();

Warum genau kann er sich die Werte nicht aus der anderen Methode holen? Funktioniert das überhaupt nicht so und muss ich das ganz anders lösen?

Edit: Danke Drexel, ich mach mich gleich mal ran.
 
Damit rennt er dann aber in die gleiche Fehlermeldung für die Methode inTage() ;-)

Grundsätzlich solltest du dir das Thema 'static' wirklich mal durchlesen.

Quick & dirty könntest du dein aktuelles Problem so lösen:

Code:
System.out.println(d1.gibDifferenz());

Edit: vergiss das - da liegt ja noch einiges mehr im Argen als die bloße Fehlermeldung :)
Siehe Drexel unter mir.
 
Zuletzt bearbeitet:
Variablen, die Du in einer Methode definierst sind nur im Scope der Methode sichtbar. Wenn Du die in anderen Methoden benutzen willst, musst Du diese als Parameter übergeben.
 
Würde das nicht bedeuten, dass, wenn ich in der Methode inTage() eine Variable (sagen wir int tage) benutze, das Ergebnis in die Variable speicher und diese dann als return ausgebe, dass meine Methode gibDifferenz() mit dieser rechnen kann?



Edit: ich habe es nun so versucht:
//Umrechnung von Tag, Monat und Jahr in Tage
public int inTage (){
tage = (tag -1) + (monat -1)*30 + jahr *360;
return tage;
}

//Die Differenz der beiden Angaben bestimmen
public int gibDifferenz(Datum d1, Datum d2){
differenz = d1.tage - d2.tage;
return differenz;
}

public static void main (String [] args){
System.out.println(differenz);
}


Nun habe ich nirgendwo mehr einen Fehler, außer in der Ausgabezeile, da mir Netbeans sagt, dass die Variable differenz nicht static referenziert werden kann.
Allerdings holt sich differenz doch seine Infos aus der ebenfalls public variablen tage.
 
Zuletzt bearbeitet:
Das machst du doch im Endeffekt eh schon.

inTage() gibt nen integer zurück. Ob der vorher in einer lokalen Variable stand oder nicht ist einer Methode, die den Rückgabewert verwurstelt egal.

Antwort zum Edit oben:

Vereinfacht ausgedrückt:

Du hast eine Klasse Datum.
Alle nicht-statischen Inhalte dieser Klasse sind innerhalb aller Instanzen dieses Objekts einzigartig.
Alle statischen Inhalte gibt es nur 1x Instanzübergreifend.

Jetzt bist du in einer Instanzübergreifenden Methode 'Main' und versuchst auf eine Variable 'differenz' zuzugreifen, die es n-mal gibt. Du musst dem System schon sagen, welche Variable 'differenz' du meinst.

Als Tipp:

Trenn deine Methoden doch einfach am besten auf in 2 Klassen. Eine Statische mit der statischen Methode Main() und eine nicht-statische mit den restlichen Methoden und Variablen.
 
Zuletzt bearbeitet:
Defender1st schrieb:
Du hast eine Klasse Datum.
Alle nicht-statischen Inhalte dieser Klasse sind innerhalb aller Instanzen dieses Objekts einzigartig.
Alle statischen Inhalte gibt es nur 1x Instanzübergreifend.

Jetzt bist du in einer Instanzübergreifenden Methode 'Main' und versuchst auf eine Variable 'differenz' zuzugreifen, die es n-mal gibt. Du musst dem System schon sagen, welche Variable 'differenz' du meinst.



Ich bin mir nicht ganz sicher ob ich dich richtig verstanden habe, meinst du, dass eine public Variable über alle Klassen eines Projektes hinweg genutzt werden können, während man bei static Variablen nur 1x von einer anderen Klasse drauf zugreifen kann?

Würde das in diesem Fall überhaupt wichtig sein? Ich habe ja nur eine Klasse und die public Variable "differenz" bekommt doch innerhalb der Laufzeit einen bestimmten Wert zugewiesen und wird nur in der Methode gibDifferenz() benutzt. Die Ausgabe des Wertes passiert doch nur noch in der static main Methode. Ist das ein Problem welches mir vorher einfach nur noch nicht untergekommen ist?

Defender1st schrieb:
Als Tipp:

Trenn deine Methoden doch einfach am besten auf in 2 Klassen. Eine Statische mit der statischen Methode Main() und eine nicht-statische mit den restlichen Methoden und Variablen.

Die Idee gefällt mir, ich habe mich daran zwar noch nie versucht (wir haben bisher nur mit einer Klasse gearbeitet, in der dann alles reingestopft wurde), aber wenn es so funktioniert, wie ich es mir gerade vorstelle, dann gefällt es mir ^^
 
Ich bin mir nicht ganz sicher ob ich dich richtig verstanden habe, meinst du, dass eine public Variable über alle Klassen eines Projektes hinweg genutzt werden können, während man bei static Variablen nur 1x von einer anderen Klasse drauf zugreifen kann?

Nein.

Ich versuche das mal anhand eines Bildes zu verdeutlichen. Als Referenz habe ich mal deinen Quellcode aus #1 genommen.
Das 'public' ist in diesem Problemfall erst einmal sekundär. Du kannst aufgrund des 'static' nicht direkt aus deiner Main-Methode auf gibDifferenz() zugreifen.

static.png

In deiner statischen Methode Main rufst du in Zeile 44 gibDifferenz() auf.
gibDifferenz() existiert allerdings nur innerhalb von d1 oder d2.
Du müsstest dann sagen d1.gibDifferenz() - damit sagst du deinem Programm direkt: Rufe gibDifferenz() in der Instanz d1 auf.

Gut. Hier hast du dann weiter das Problem, dass du innerhalb der Methode gibDifferenz() nicht auf d1 und d2 zugreifen kannst. Dies würde sich auf verschiedene Arten lösen lassen.... Globale Variablen, Übergabeparameter...

Das Sauberste ist hier imho das Auftrennen der Methoden in Statische und nicht Statische Klassen.
 
Defender1st schrieb:
Nein.

Ich versuche das mal anhand eines Bildes zu verdeutlichen. Als Referenz habe ich mal deinen Quellcode aus #1 genommen.
Das 'public' ist in diesem Problemfall erst einmal sekundär. Du kannst aufgrund des 'static' nicht direkt aus deiner Main-Methode auf gibDifferenz() zugreifen.

Anhang anzeigen 615949

In deiner statischen Methode Main rufst du in Zeile 44 gibDifferenz() auf.
gibDifferenz() existiert allerdings nur innerhalb von d1 oder d2.
Du müsstest dann sagen d1.gibDifferenz() - damit sagst du deinem Programm direkt: Rufe gibDifferenz() in der Instanz d1 auf.

Gut. Hier hast du dann weiter das Problem, dass du innerhalb der Methode gibDifferenz() nicht auf d1 und d2 zugreifen kannst. Dies würde sich auf verschiedene Arten lösen lassen.... Globale Variablen, Übergabeparameter...

Das Sauberste ist hier imho das Auftrennen der Methoden in Statische und nicht Statische Klassen.



AHHH okay, jetzt hat es endlich Klick gemacht. Danke dir dafür. Ich denke, dass ich es jetzt hinbekommen werde, werde mich aber ebenfalls mal an den aufgetrennten Klassen versuchen.
 
Du kannst nicht einfach auf Variablen, die in anderen Methoden definiert sind zugreifen.

Hier nochmal ein Code wie es laufen sollte:
Code:
public class Datum {
    int tag;
    int monat;
    int jahr;
    int tage;
    int differenz;
    
   //Konstruktor 
   public Datum (int t, int m, int j){
       tag = t;
       monat = m;
       jahr = j;
   } 
   
   //Umrechnung von Tag, Monat und Jahr in Tage
   public int inTage (){
       return (tag -1) + (monat -1)*30 + jahr *360;
    }
   
   //Die Differenz der beiden Angaben bestimmen
    public int gibDifferenz(Datum d){
       
       return this.inTage() - d.inTage();
       
    }
           
  public static void main (String [] args){
  
      Datum d1 = new Datum (30,1,2017);
      Datum d2 = new Datum (25,5,2009);
      
      //Testausgabe von d1
      System.out.println("Tag:" + d1.tag);
      System.out.println("Monat: " + d1.monat);
      System.out.println("Jahr: " + d1.jahr);
      System.out.println("Anzahl der Tage: " + d1.inTage());
      
	  //Testausgabe von d1
      System.out.println("Tag:" + d2.tag);
      System.out.println("Monat: " + d2.monat);
      System.out.println("Jahr: " + d2.jahr);
      System.out.println("Anzahl der Tage: " + d2.inTage());
      
      System.out.println(d1.gibDifferenz(d2));

  //Das geht dann natürlich auch:
  System.out.println(d2.gibDifferenz(d1));

  //Oder:
  System.out.println(d1.gibDifferenz(d1));
  }                    
}

Nur Sachen, die static sind, kannst Du ohne Objekt verwenden und über den Klassennamen.Member von überall aus aufrufen. Objektbezogene Member musst Du explizit an andere Methoden übergeben.

Btw wolltet solltest Du die Datumsklasse von der Main Methode separieren als eigene Klasse und eigene Datei. Die Main Methode muss dann eine eigene Klasse bekommen.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben