# methode... in class... cannot be applied to given types



## xcaver (7. Jan 2013)

hallöschien ich hab ein kleines problem ...
ich habe zwei klassen;
in der einen klasse habe ich die methode buchen : 


```
public double buchen() {
    double zahl2 = Double.parseDouble(nf_konto.getText());
    double zahl1 = Double.parseDouble(nf_einsatz.getText());
    double Ergebnis = zahl2 - zahl1;
    String.valueOf(Ergebnis);
    
    }
```
und in der anderen klasse habe ich ein butten bei dem ich beim drücken die methode der anderen klasse ausführen möchte :


```
public void ziehen_ActionPerformed(ActionEvent evt) {
    
//...
    double Ergebnis;
    this.nf_konto.setDouble(Bandit.buchen(Ergebnis));
   
  } // end of ziehen_ActionPerformed
```

ich begreife nicht wie der code lauten muss ... meine fehler medlung ist :


```
Spiel.java:78:35: error: method buchen in class Bandit cannot be applied to given types;
    this.nf_konto.setDouble(Bandit.buchen(Ergebnis));
                                  ^
  required: no arguments
  found: double
  reason: actual and formal argument lists differ in length
1 error
```

erbitte um hilfe xcaver


----------



## civben85 (7. Jan 2013)

Also so wie ich es verstehe solltest du dir die Methode buchen() in der Klasse Bandit anschauen.
Die ist bei dir anscheinend ohne Parameter ( buchen() ) implementiert aber du rufst sie hier mit einem double ( buchen(double d)) ) auf.

Ich glaube du musst die Methode buchen() in Bandit ändern.


----------



## xcaver (7. Jan 2013)

Wie meinst du "sie ist ohne Paramenter implementiert" ??
inwiefern muss ich da was ändern??


----------



## civben85 (7. Jan 2013)

Naja, deine Klasse Bandit enhält eine Mehtode buchen().

Wenn du diese Methode aufrufst dann darfst du kein Parameter (in deinem Code "Ergebnis") in den Klammern stehen haben wenn du sie aufruftst.

Es sei denn du schreibst eine Methode buchen(double d) in der Klasse Bandit.


----------



## Marcinek (7. Jan 2013)

Google doch mal nach: actual and formal argument lists differ in length

Oder übersetze es ins deutsche.


----------



## Xcaver (7. Jan 2013)

Ahh ich komm immer noch nicht weiter ... das hat mich jetzt mehr verwirt als mir geholfen....
ich will doch nur das ergebnis aus meiner methode buchen von der klasse Konto mit hilfe des buttens in der Klasse Spiel in ein NumberField übertragen ...=( das kann doch nicht so komplieziert sein ...oder?
xcaver


----------



## L-ectron-X (7. Jan 2013)

So sollte das gehen:


```
public double buchen() {
    double zahl2 = Double.parseDouble(nf_konto.getText());
    double zahl1 = Double.parseDouble(nf_einsatz.getText());
    return zahl2 - zahl1;    
}
```


```
public void ziehen_ActionPerformed(ActionEvent evt) {
    
//...
    this.nf_konto.setDouble(Bandit.buchen()); // <-- Bandit muss aber eine Instanz sein!
   
} // end of ziehen_ActionPerformed
```


----------



## xcaver (7. Jan 2013)

Danke für den Tipp...
ich habe das ganse jetzt so gelöst :


```
public double buchen() {
    double zahl2 = Double.parseDouble(nf_konto.getText());
    double zahl1 = Double.parseDouble(nf_einsatz.getText());
    return zahl2 - zahl1;
    
    
    }
```

und der butten:


```
public void ziehen_ActionPerformed(ActionEvent evt) {
 
//.....
   Bandit MeinBandit = new Bandit();
    MeinBandit.buchen(); 
    double Ergebnis;
    this.nf_konto.setText(String.valueOf(MeinBandit.buchen()));
    
  } // end of ziehen_ActionPerformed
```

Damit kann ich die Anwendung jedenfalls schonmal starten und die weiteren funktionen des Buttens tuhen auch ihre wirkung jedoch nicht das was er hier machen soll ...

ich griege eine Fehlermeldung doch weis nur leider gar nichts damit anzufangen :


```
Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
	at java.lang.Double.parseDouble(Double.java:540)
	at Bandit.buchen(Bandit.java:24)
	at Spiel.ziehen_ActionPerformed(Spiel.java:79)
	at Spiel$1.actionPerformed(Spiel.java:37)
	at java.awt.Button.processActionEvent(Button.java:409)
	at java.awt.Button.processEvent(Button.java:377)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:682)
	at java.awt.EventQueue$3.run(EventQueue.java:680)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:696)
	at java.awt.EventQueue$4.run(EventQueue.java:694)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
```


----------



## L-ectron-X (7. Jan 2013)

Wahrscheinlich hast du bei der Ausführung deines Programms ein oder mehrere Textfelder leer gelassen, also keine Eingabe getätigt. Ein Leerstring kann nicht in eine Fließkommazahl geparst werden.

Zeile 5 und 6 aus deiner ziehen_ActionPerformed()-Methode sollten aus dem obigen Codefragment verschwinden.


----------



## Final_Striker (7. Jan 2013)

```
double zahl2 = Double.parseDouble(nf_konto.getText());
    double zahl1 = Double.parseDouble(nf_einsatz.getText());
```

Entweder 
	
	
	
	





```
nf_konto.getText()
```
 oder 
	
	
	
	





```
nf_einsatz.getText()
```
 gibt einen leeren String zurück und den kann man halt nicht in eine Zahl umwandeln.


----------



## xcaver (7. Jan 2013)

gans ehrlich kann mir mal bitte einer erklären wie man einen leeren string finden soll ??
Meinen Kenntnissen zu folge sollte es funktionieren ... was es aber nicht tut ... nur ich habe echt keine ahnung ...


----------



## L-ectron-X (7. Jan 2013)

Was gibst du denn in deine Textfelder ein? Offenbar nichts. Tippe da mal Zahlen ein.
Mehr kann man aus den Codefragmenten und der Fehlermeldung nicht entnehmen.


----------



## xcaver (8. Jan 2013)

na klar geb ich da was ein ... Entschuldigung bitte ich bin doch net blöd =P 
ich versuche eine Spielmaschine zu bauen ... und hier soll halt der einsatz von guthaben verrechnet entnommen werden ...
ob ich jetzt das standtartdas guthaben via butten und methode eingebe oder die felder per hand fülle kommt das selbe ergebnis ...-_- 


```
Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
	at java.lang.Double.parseDouble(Double.java:540)
	at Bandit.buchen(Bandit.java:24)
	at Spiel.ziehen_ActionPerformed(Spiel.java:80)
	at Spiel$1.actionPerformed(Spiel.java:37)
	at java.awt.Button.processActionEvent(Button.java:409)
	at java.awt.Button.processEvent(Button.java:377)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:682)
	at java.awt.EventQueue$3.run(EventQueue.java:680)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:696)
	at java.awt.EventQueue$4.run(EventQueue.java:694)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
```


----------



## L-ectron-X (8. Jan 2013)

Die Fehlermeldung sagt aber nichts anderes. Vielleicht hast du ein Textfeld mehrmals instanziiert.


----------



## xcaver (8. Jan 2013)

wie du meinen ?? ich verstehe das grad nicht so richtig ... was meinst du mit Testfeldmehrmals instanzziert ?? 

also ich habe jetzt auch noch mal bissel was probier und wenn ich halt den befehl der methode buchen direkt in den butten hinnein schreibe funktioniert es aber warum nicht wenn es über eine andere methode läuft ... ich bin da echt überfragt ... =(


----------



## Final_Striker (8. Jan 2013)

Wir können dir nur sagen, dass der Fehler auftritt, wenn du versucht einen leeren String in eine Zahl zu parsen. Wieso das so ist, kann man bei diesem Codestück nicht sagen.


----------



## xcaver (8. Jan 2013)

Ich brobiere jetzt weiter zumachen in dem ich das buchen direkt im butten mache, so funktioniert es ja ...
wäre nur schöner würde es in einer extra methode sein ....

Hier nochmal der komplette code ... vllt sieht ja jemand hier nen Fehler voran das liegen könnte ...

Spiel-Klasse
	
	
	
	





```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 07.01.2013
  * @author 
  */

public class Spiel extends Applet {
  // Anfang Attribute
  private Button ziehen = new Button();
  private Button neustart = new Button();
  private NumberField nf_1 = new NumberField();
  private NumberField nf_2 = new NumberField();
  private NumberField nf_3 = new NumberField();
  public  NumberField nf_konto = new NumberField();
  public NumberField nf_einsatz = new NumberField();
  public TextArea ta = new TextArea("", 1, 1, TextArea.SCROLLBARS_BOTH);
  double MeinKonto;
  double MeinEinsatz;
  // Ende Attribute
  
  public void init() {
    Panel cp = new Panel(null);
    cp.setBounds(0, 0, 306, 360);
    add(cp);
    // Anfang Komponenten
    
    ziehen.setBounds(168, 56, 81, 41);
    ziehen.setLabel("ziehen");
    ziehen.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        ziehen_ActionPerformed(evt);
      }
    });
    cp.add(ziehen);
    neustart.setBounds(40, 56, 97, 49);
    neustart.setLabel("neu start");
    neustart.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        neustart_ActionPerformed(evt);
      }
    });
    cp.add(neustart);
    nf_1.setBounds(40, 136, 65, 65);
    nf_1.setText("");
    cp.add(nf_1);
    nf_2.setBounds(128, 152, 33, 49);
    nf_2.setText("");
    cp.add(nf_2);
    nf_3.setBounds(192, 144, 65, 65);
    nf_3.setText("");
    cp.add(nf_3);
    nf_konto.setBounds(176, 8, 81, 33);
    nf_konto.setText("");
    cp.add(nf_konto);
    nf_einsatz.setBounds(48, 0, 89, 41);
    nf_einsatz.setText("");
    cp.add(nf_einsatz);
    ta.setBounds(56, 224, 185, 65);
    cp.add(ta);
    // Ende Komponenten
    
  } // end of init
  
  // Anfang Methoden
  public void ziehen_ActionPerformed(ActionEvent evt) {
    Bandit MeinBandit = new Bandit();
    
    double zahl2 = nf_konto.getDouble();
    double zahl1 = nf_einsatz.getDouble();
    double Ergebnis =zahl2 - zahl1;  
    
    
    nf_1.setText(String.valueOf(Bandit.Zufall())); 
    nf_2.setText(String.valueOf(Bandit.Zufall())); 
    nf_3.setText(String.valueOf(Bandit.Zufall())); 
    nf_konto.setDouble(MeinBandit.buchen());
    
  } // end of ziehen_ActionPerformed
  
  public void neustart_ActionPerformed(ActionEvent evt) {
    double MeinKonto;
    MeinKonto=200;
    nf_konto.setDouble(Double.valueOf(MeinKonto));
    
    // TODO hier Quelltext einfügen
  } // end of neustart_ActionPerformed
  
  // Ende Methoden
  
} // end of class plubb
```

Und Bandit-Klasse
	
	
	
	





```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 07.01.2013
  * @author 
  */

public class Bandit extends Spiel{
  
  // Anfang Attribute
  private double Rest = 0;
  public boolean error =false;
  public double Ergebnis;
  // Ende Attribute   
  
  public static int Zufall() {
    int A ;
    A=(int)(Math.random()*4+1);
    return A;
  }                                                        
  
  public double buchen() {
    
    double zahl2 = nf_konto.getDouble();
    double zahl1 = nf_einsatz.getDouble();
    double Ergebnis =zahl2 - zahl1; 
    if (Ergebnis <= 0) {
      nf_konto.setDouble(0);
      this.error = true;
    } else {// end of if
      return Ergebnis;                          
    } 
    return Ergebnis;
  }
  
  
  public void error(){
    if (this.buchen()<0) {
        this.error=true;
    } 
    }// end of if
  
  
  
  
  // Anfang Methoden
  public double getErgebnis() {
    return Ergebnis;
  }
  
  public void setErgebnis(double Ergebnis) {
    this.Ergebnis = Ergebnis;
  }
  
  // Ende Methoden
} // end of Bandit
```

wäre schön wenn man mir noch weiter helfen könnte diesen verflixten kleinen kompliezierten fehler zu beheben  
xcaver


----------



## Final_Striker (8. Jan 2013)

Die Eingabefelder in dem 
	
	
	
	





```
MeinBandit
```
Objekt sind natürlich leer, weil du zur Eingaben die Felder aus der Klasse Spiel verwendest.

Außerdem die Klasse Bandit von der Klasse Spiel abzuleiten macht hier nicht wirklich einen Sinn.


----------



## tröööt (8. Jan 2013)

OUCH ... da hat aber jemand einfach wild drauf los geschrieben ohne hintergrundwisse zu haben ...

Bandit erbt von Spiel ... und damit auch nfKonto und nfEinsatz ("_" im variablen namen sollte man nur bei konstanten verwenden ... siehe dazu die coding conventions) ... womit Bandit seine eigenen felder hat ...

konkret gibst du nur daten in Spiel.nf_einsatz und Spiel.nf_konto ein ... Bandit.nf_einsatz und Bandit.nf_konto bleiben aber "leer" ... weshalb eine NumberFormatException fliegt ..

schau dir noch mal die grundlagen von java ... vielleicht verstehst du es dann ...


----------



## xcaver (8. Jan 2013)

ich glaube ich habe verstanden worin mein fehler liegt ... ich weis das ich nich grade gut in java bin das ist auch erst mein 5 projekt oder so ....
doch wie kann man es anstellen, dass die klasse bandit auf die eingabe felder (nfkonto und nfeinsatz) aus der klasse Spiel zugreifen kann ??
ich hatte gedacht durch den befehl "extends Spiel" könnte die klasse Bandit dies tun ....


----------



## SlaterB (8. Jan 2013)

nimm diesen Trugschluss sehr wichtig, denke noch lange daran und begehe möglichst nie wieder diesen Fehler, der zur schwersten Kategorie gehört,
das Denken ganz vernebelt

hatte ja auch schon in
http://www.java-forum.org/hausaufgaben/146237-stackoverflowerror.html
fatalste Folgen

nur weil ein Lenkrad ein Auto braucht, muss doch nicht das Lenkrad selber auch ein Auto sein..
zwei Objekte können unabhängig voneinander sein und sich einfach gegenseitig ansprechen

was ist mit dem Button 'ziehen' oder dem NumberField 'nf_1', muss Spiel jetzt von Button, von NumberField und wer weiß wie vielen Dingen gleichzeitig erben, um diese verwenden zu können?
nein, es reichen Variablen, erzeugte Objekte, einfach ansprechen: 
will ich was von x? x.gibMirWas();

dabei natürlich immer noch auf Endlosschleifen achten, ein kleiner Wicht wie Konto oder Bandit kann sich nicht ein neues großes komplettes Spiel-Objekt erzeugen,
sondern Spiel erzeugt alle anderen und übergibt sich selber (this) gegebenenfalls im Konstruktor als Parameter, oder per set-Methode,
Bandit braucht gewiss Spiel in einem Attribut, aber nicht selbst erzeugen, sondern das vorhandene Objekt übernehmen

dann vielleicht in Bandit:
getSpiel().getTextFeldXY().getText()
oder eher
getSpiel().getTextXY()
und Spiel ist überlassen woher dieser Text kommt, 
sicher auch aus dem Textfeld, aber das müssen andere Klassen gar nicht wissen


----------



## xcaver (8. Jan 2013)

ahh ich glaub ich hab verstanden was du meinst ...
also anstatt Bandit ein teil von Spiel sein zu lassen, muss ich in meiner klasse Bandit direkt denn wert aus meinem numberfield in Klasse Spiel aufrufen (ihn halt direkt an sprechen).

ist dann die folgende zeile in meiner methde buchen so richtig??

Spiel.nfkonto().getText =zahl2; 

weil er mir hier sacht das er nfkonto nicht finden kann ... warum auch immer -_-


----------



## SlaterB (8. Jan 2013)

kommt darauf an wie Spiel zu erreichen ist, als Attribut besser klein,
alternativ zu vielen get-Methoden, die man natürlich erst programmieren muss, wäre es mit Attributen die Richtung

spiel.nfkonto.getText()

was =zahl2; bei dir bedeuten soll kann ich nicht erkennen, Vergleichen mit ==, bei Strings aber falsch, equals(),
Zuweisung mit setText()-Methode


----------



## xcaver (8. Jan 2013)

wuhuuuu es hat funktioniert... =D =D =D jedenfals so weit ...=P

In meiner Klasse Spiel hab ich die beiden numerfiels stetic gemacht :
public static  NumberField nfkonto = new NumberField();
  public static NumberField nfeinsatz = new NumberField();

und meine methode buchen sieht jetzt wie folgt aus :


```
public double buchen() {
    double zahl2 = Spiel.nfkonto.getDouble();
    double zahl1 = Spiel.nfeinsatz.getDouble();
    double Ergebnis =zahl2 - zahl1; 
    
    return Ergebnis;
```

ich brauch zahl1 und zahl2 damit ich diese von einander abziehen kann ... (zahl2 ist in diesefall das konto oder guthaben des Spielers der spielmaschine und zahl1 sein einsatz) 
danke für die hilfe =D

jetzt muss ich nur noch schauen das ich die andern funktionen welche ich jetzt alle in den butten rein geschrieben habe auch in extra methoden hinbekomme ... 
xcaver


----------



## Firephoenix (8. Jan 2013)

Dann kriegst du aber Probleme sobald du die Klasse mit den Textfeldern mehrfach verwenden solltest (mehrere Instanzen im gleichen Programm), da dann alle Klassen die gleichen Textfelder benutzen.

Sinnvoller ist es, zur Kommunikation zwischen Klassen Referenzen auf die Klassen oder Passende Interfaces mitzugeben.
(Pseudocode)

```
class A{
private TextField textField = ...;

public TextField getTextField(){
return textField;
}
}

class B{

private A a;

public B(A a){
this.a = a;
}

public void doSomething(){
a.getTextField().macheIrgendwasMitDemText();
}

}
```

[EDIT]Anwendungsbeispiel:

```
A a = new A();
B b = new B(a);
//Text eingeben
//...
b.doSomething();
```
[/EDIT]
static ist ein Keyword um Attribute und Methoden von konkreten Objekten zu entkoppeln (entweder weil man gezielt aus einer Klasse raus will (wieviele Instanzen wurden erzeugt - klassischer Fall), oder weil man Methoden hat, die nichts in der Klasse beeinflussen (Beispiel Math: in der Klasse rechnen alle Methoden irgend etwas aus, aber in der Klasse selber ändert sich nichts, egal wie oft du Math.pow etc aufrufst. Daher sind dort alle Methoden static).

static zu Verwenden um Zugriff auf Felder anderer Klassen zu haben ist in etwa so als würdest du mit der Abrissbirne deine Hauswand einreißen weil du ein 20CM Regal benötigst um deine Pokalsammlung aufzustellen. Ist die Wand weg kannst du super deine Pokale auf der Bruchstelle platzieren, dafür wird es im Winter kalt und wenn du pech hast fliegt dir Übermorgen noch dein Dach auf den Kopf.

Gruß


----------



## SlaterB (8. Jan 2013)

Firephoenix hat gesagt.:


> Sinnvoller ist es, zur Kommunikation zwischen Klassen Referenzen auf die Klassen oder Passende Interfaces mitzugeben.


wenn du schon extra Objekte von Klassen unterscheidest, dann doch lieber Referenzen auf die einzelnen Objekte statt die Klassen als Sprechweise


----------



## xcaver (8. Jan 2013)

also bei mir kam es nicht weiter zu Problemen ...
ich habe das jetzt im sinne so gemacht über einen klick auf den butten laufen die verschiedenen methoden durch ... jede methode liest immer meine beiden textfelder ein und arbeitet dann mit den werten. Wenn die methode fertig ist schreibt sie ihre ergebnisse wd in die textfelder. Dann kommt die negste methode welche dann wd die teytfelder ausliest und dann wd zurück gibt usw ...
also bei mir hat das funktioniert =D
auch wenns etwas grob ist


----------

