Compiler-Fehler Programm lässt sich nicht kompilieren

Vulymuz

Aktives Mitglied
Hallo,

folge Klassen lassen sich nicht komplimieren. Ich weiß auch worin der Fehler besteht, weiß allerdings nicht, wie ich ihn beheben kann.

Java:
import java.util.ArrayList;

public class DotCom {
  
  private ArrayList<String> zellorte;
  
  public void setZellorte(ArrayList<String> orte) {
    zellorte = orte;
  }
  
  public String prüfDich(String benutzerEingabe) {
    
    String ergebnis = "Vorbei";
    
    int index = zellorte.indexOf(benutzerEingabe);
    
    if (index >= 0) {
      zellorte.remove(index);
      
      if (zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } // end of if
      else {
        ergebnis = "Treffer";
      } // end of if-else
    } // end of if
    System.out.println(ergebnis);
    
    return ergebnis;
    }
}

Java:
public class EinfachesDotComSpiel {
  
  public static void main(String[] args) {
    
    int anzahlTipps = 0;
    SpielHelfer helfer = new SpielHelfer();
    
    DotCom dasDotCom = new DotCom();
    
    int zufallsZahl = (int) (Math.random() * 5);
    
    int[] orte = {zufallsZahl, zufallsZahl+1, zufallsZahl+2};
    
    dasDotCom.setZellorte(orte);
    
    boolean lebt = true;
    
    while (lebt == true) {
      String tipp = helfer.getBenutzereingabe("Geben Sie eine Zahl ein");
      String ergebnis = dasDotCom.prüfDich(tipp);
      anzahlTipps++;
      
      if (ergebnis.equals("Versenkt")) {
        lebt = false;
        System.out.println("Sie haben " + anzahlTipps + " Versuche benötigt!");
      } // end of if
    } // end of while
  }
  }

Java:
Compiliere C:\Users\Alireza\Desktop\Ordnersammlung\Schule & Bildung\Informatik\Privat\Informatik Spielekiste\Schiffeversenken\EinfachesDotComSpiel.java mit Java-Compiler
EinfachesDotComSpiel.java:14:14: error: method setZellorte in class DotCom cannot be applied to given types;
    dasDotCom.setZellorte(orte);
             ^
  required: ArrayList<String>
  found: int[]
  reason: actual argument int[] cannot be converted to ArrayList<String> by method invocation conversion
1 error

Der Fehler ist eben, dass ich in der DotCom-Klasse eine ArrayList<String> orte habe, während ich in der EinfachesDotComSpiel für die ein Array namens orte mit dem Typ int[] benutze.

Doch wie bekomme ich das Problem gelöst? :bahnhof:
 
Zuletzt bearbeitet von einem Moderator:
Vulymuz hat gesagt.:
Einen int in einen String zu wandeln, denke ich mal.
Geht so:
Java:
String intStr = Integer.toString(<DeinInt>);
Und, um aus einem Array eine Liste zu machen, kannste das Nutzen:
Java:
Arrays.asList(<DeinArray>);
 
Zuletzt bearbeitet von einem Moderator:
Eine Möglichkeit wäre, die Methode setZellorte so zu überladen, sodass du auch int-Werte als Argument zulässt.
Java:
	public static void setZellorte(int... numbers) {
		zellorte = new ArrayList<String>();
		for (int i : numbers)
			zellorte.add(String.valueOf(i));
	}

Trotzdem solltest du dir überlegen, ob dein
Code:
ArrayList<String> zellorte
in diesem Fall gut gewählt ist. Erstens verwendet man bei der Deklaration immer das Interface, also
Code:
List<String> zellorte
. Zweitens ist eine Liste, die int-Werte enthält, nunmal eine
Code:
List<Integer>
und keine
Code:
List<String>
.
 
Wie müsste ich das in meinem Programm einfügen, damit es kompiliert werden kann?
Java:
....

    String[] orte = {Integer.toString(zufallsZahl), Integer.toString(zufallsZahl+1), Integer.toString(zufallsZahl+2)};
    ArrayList<String> al=null;
    al.add(orte[0]);
    al.add(orte[1]);
    al.add(orte[2]);
    dasDotCom.setZellorte(al);

....

So ginge es wohl. al.add sollte man eher im Loop ausführen - aber das verbessert die Optik kaum. Sieht alles ziemlich grauslich aus.

Die andere Antwort, direkt vor mir ist besser. Würde jetzt auf meine verzichten, geht aber wohl mit "Ändern"-Button nicht mehr.

Ich ändere nochmal, um eine Anmerkung zu machen: Die andere Antwort ist vor allem deshalb besser weil sich der Aufrufer nicht um das Speicherverfahren kümmern muss. Diese Logik liegt alleine beim entsprechdenden Objekt - und das muss auch so sein
 
Zuletzt bearbeitet:
Jo, danke euch! 🙂

Eine Frage nebenbei: Wie fängt ihr eigentlich an, ein bestimmtes Projekt zu programmieren? Schreibt ihr erst auf, was alles wichtig ist und fangt dann an zu programmieren, oder programmiert ihr direkt von Anfang an drauf los? Was wäre vorteilshafter? 🙂
 
Wenn's noch nicht gelöst ist oder die Lösung mehr umständlich als erwartet erscheint, dann könnte es evtl. auch an Umlauten in Methodennamen (oder überhaupt im Quelltext, ausserhalb von Anführungszeichen) liegen. Ich erinnere mich an Zeiten, wo solche Dinge zu unvorhergesehenen Fehlern führten.
@Ullrich: "ArrayList<Irgendwas> bla=null;" und dann gleich etwas adden, kann nur zu einer NPE führen.
 
Zuletzt bearbeitet von einem Moderator:
Wenn's noch nicht gelöst ist oder die Lösung mehr umständlich als erwartet erscheint, dann könnte es evtl. auch an Umlauten in Methodennamen (oder überhaupt im Quelltext, ausserhalb von Anführungszeichen) liegen. Ich erinnere mich an Zeiten, wo solche Dinge zu unvorhergesehenen Fehlern führten.
@Ullrich: "ArrayList<Irgendwas> bla=null;" und dann gleich etwas adden, kann nur zu einer NPE führen.
Du hast natürlich recht. Ich hatte so angefangen und dann das instanziieren vergessen.
 
Um nochmal auf das Umwandeln zu sprechen zu kommen, was spricht gegen
Java:
String intStr = "" + deinInt;
?
 
  1. Schlechter Code (es ist nicht direkt erkennbar, was die Konkatenation soll).
  2. Unperformant. Durch die unnötige Konkatenation wird ein StringBuilder erzeugt.
 
Um nochmal auf das Umwandeln zu sprechen zu kommen, was spricht gegen
Java:
String intStr = "" + deinInt;
?

1) unperformant : der Compiler macht nämlich aus diesem Code folgendes :
Java:
String intStr=(new StringBuilder()).append(deinInt).toString();
Das ist unsauber, unperformant und zeigt das derjenige weder die API kennt noch sich überhaupt mit INT -> String befasst hat.
Besser ist auf jeden Fall :
Java:
String intStr=Integer.valueOf(deinInt);
Wobei das intern nur für -128 bis +127 performant ist, für alle anderen Werte wird dann intern Integer.parseInt(String) gecallt.

2) extrem unsauber : durch
Code:
String string=""+int;
wird eben NICHT sofort ersichtlich das man einen INT zu einem String machen will, sondern lediglich das ein leerer String ("") mit irgendetwas anderem zusammengepackt werden soll ("+...").

3) zusätzlicher Ovherhead : dadurch das ein neues String-Objekt durch StringBuilder.toString() angelegt wird wird auch wieder ein weiterer String zum String-Pool hinzugefügt, was zusätzliche Belastung des der VM zur verfügung stehenden Heap-Speichers bedeutet.
 
und die letzten beiden Posts sagen uns jetzt was?
1. [c](new StringBuilder()).append(deinInt).toString();[/c] wäre auch unperformant und
2. [c]Integer.valueOf(int)[/c] liefert eine Integer Instanz und keinen String und nur der Integer wird gechached.
3. [c]String.valueOf(int)[/c] ist die die richtige Wahl. Hätte da nichts von "gecached" gestanden, hätte ich geschrieben, dass das wohl auch gemeint war.

Am unsaubersten und möglicherweise ist's auch der Verursacher des Fehlers dürfte [c]prüfDich(String benutzereingabe)[/c] sein. Umlaut in Methodenname.
[edit]Naja, auch wenn's nicht den Fehler ausmacht und auch gestattet ist, es bleibt unschön, vorallem in dem ein oder anderen Quelltext Viewer/-Editor.
Hier mein Lösungsvorschlag (Das mit "List<Irgendwas>" statt mit "ArrayList<Irgendwas>" wurde ja schon erwähnt):
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
class DotCom {
  
  private List<Integer> zellorte;
  
  public void setZellorte(List<Integer> orte) {
    zellorte = orte;
  }
  
  public String pruefDich(String benutzerEingabe) {
    
    String ergebnis = "Vorbei";
    
    int index = zellorte.indexOf(benutzerEingabe);
    
    if (index >= 0) {
      zellorte.remove(index);
      
      if (zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } // end of if
      else {
        ergebnis = "Treffer";
      } // end of if-else
    } // end of if
    System.out.println(ergebnis);
    
    return ergebnis;
    }
}

public class EinfachesDotComSpiel {
	  
	  public static void main(String[] args) {
	    
	    int anzahlTipps = 0;
	    SpielHelfer helfer = new SpielHelfer();
	    
	    DotCom dasDotCom = new DotCom();
	    
	    int zufallsZahl = (int) (Math.random() * 5);
	    
	    Integer[] orte = {zufallsZahl, zufallsZahl+1, zufallsZahl+2};
	    
	    dasDotCom.setZellorte(Arrays.asList(orte));
	    
	    boolean lebt = true;
	    
	    while (lebt == true) {
	      String tipp = helfer.getBenutzereingabe("Geben Sie eine Zahl ein");
	      String ergebnis = dasDotCom.pruefDich(tipp);
	      anzahlTipps++;
	      
	      if (ergebnis.equals("Versenkt")) {
	        lebt = false;
	        System.out.println("Sie haben " + anzahlTipps + " Versuche benötigt!");
	      } // end of if
	    } // end of while
	  }
}
[/edit]
 
Zuletzt bearbeitet von einem Moderator:
Was bringt nun dieses "List<Integer>" eigentlich? Was sagt es aus? (Frischer Anfänger) ^^
Und was bedeutet "NPE"?
 
Zuletzt bearbeitet:
1) Google mal nach

Java Listen und Generics

2) Geh mal mit der Maus über "NPE", dann siehst du es ;D
 
Funktioniert leider nicht. Egal welche Zahl ich eingebe, es kommt immer "Vorbei" als Trefferanzeige.

Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
class DotCom {
  
  private List<Integer> zellorte;
  
  public void setZellorte(List<Integer> orte) {
    zellorte = orte;
  }
  
  public String pruefDich(String benutzerEingabe) {
    
    String ergebnis = "Vorbei";
    
    int index = zellorte.indexOf(benutzerEingabe);
    
    if (index >= 0) {
      zellorte.remove(index);
      
      if (zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } // end of if
      else {
        ergebnis = "Treffer";
      } // end of if-else
    } // end of if
    System.out.println(ergebnis);
    
    return ergebnis;
    }
}

public class EinfachesDotComSpiel {
	  
	  public static void main(String[] args) {
	    
	    int anzahlTipps = 0;
	    SpielHelfer helfer = new SpielHelfer();
	    
	    DotCom dasDotCom = new DotCom();
	    
	    int zufallsZahl = (int) (Math.random() * 5);
	    
	    Integer[] orte = {zufallsZahl, zufallsZahl+1, zufallsZahl+2};
	    
	    dasDotCom.setZellorte(Arrays.asList(orte));
	    
	    boolean lebt = true;
	    
	    while (lebt == true) {
	      String tipp = helfer.getBenutzereingabe("Geben Sie eine Zahl ein");
	      String ergebnis = dasDotCom.pruefDich(tipp);
	      anzahlTipps++;
	      
	      if (ergebnis.equals("Versenkt")) {
	        lebt = false;
	        System.out.println("Sie haben " + anzahlTipps + " Versuche benötigt!");
	      } // end of if
	    } // end of while
	  }
}
[/edit]
 
Oh wie Peinlich...😳 Du musst natürlich bei "pruefDich" nun ein int übergeben. Das sieht dann etwa so aus...
Java:
  public String pruefDich(int benutzerEingabe) {
    
    String ergebnis = "Vorbei";
    
    int index = zellorte.indexOf(benutzerEingabe);
    
    if (index >= 0) {
      zellorte.remove(index);
      
      if (zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } // end of if
      else {
        ergebnis = "Treffer";
      } // end of if-else
    } // end of if
    System.out.println(ergebnis);
    
    return ergebnis;
    }
Normalerweise sollte "benutzerEingabe" dann auch automatisch in ein Integer geboxed werden, so das man sich einen expliziten Cast sparen kann.
 
Warum jetzt ein int statt String? :s

Edit: Klappt immer noch nicht!

Muss man das alles als frischer Neuling wirklich schon verstehen? D: Einiges klingt plausibel, das wiederum nicht...

Nächste Frage wäre: Warum ist jetzt eigentlich "public String prüfDich(bla)" und nicht "public void prüfDich(bla)"?
 
Zuletzt bearbeitet:
Nächste Frage wäre: Warum ist jetzt eigentlich "public String prüfDich(bla)" und nicht "public void prüfDich(bla)"?
Wo siehst du denn da ein "void prüfDich(bla)"? ???:L
Okay, dann eben anders...
Java:
  public String pruefDich(String benutzerEingabe) {
    
    String ergebnis = "Vorbei";
    
    int index = zellorte.indexOf(Integer.parseInt(benutzerEingabe));
    
    if (index >= 0) {
      zellorte.remove(index);
      
      if (zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } // end of if
      else {
        ergebnis = "Treffer";
      } // end of if-else
    } // end of if
    System.out.println(ergebnis);
    
    return ergebnis;
    }
 
Wieso verwendest du statt "SpielHelfer" nicht den dafür vorgesehenen Scanner? Wenn du die Benutzereingabe über nextInt() einliest, ersparst du dir die Umwandlung von String nach int.

So funktioniert es bei mir:
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
 
class DotCom {
  
  private List<Integer> zellorte;
  
  public void setZellorte(Integer... orte) {
    zellorte = new ArrayList<Integer>(Arrays.asList(orte));
  }
  
  public String pruefDich(int benutzerEingabe) {
	    
	    String ergebnis = "Vorbei";
	    
	    int index = zellorte.indexOf(benutzerEingabe);
	    
	    if (index >= 0) {
	      zellorte.remove(index);
	      
	      if (zellorte.isEmpty()) {
	        ergebnis = "Versenkt";
	      } // end of if
	      else {
	        ergebnis = "Treffer";
	      } // end of if-else
	    } // end of if
	    System.out.println(ergebnis);
	    
	    return ergebnis;
	    }
  
}
 
public class EinfachesDotComSpiel {
      
      public static void main(String[] args) {
        
        int anzahlTipps = 0;
        //SpielHelfer helfer = new SpielHelfer();
        Scanner scanner = new Scanner(System.in);
        
        DotCom dasDotCom = new DotCom();
        
        int zufallsZahl = (int) (Math.random() * 5);
        
        dasDotCom.setZellorte(zufallsZahl, zufallsZahl+1, zufallsZahl+2);
        
        boolean lebt = true;
        
        while (lebt == true) {
          //String tipp = Integer.parseInt(helfer.getBenutzereingabe("Geben Sie eine Zahl ein"));
          System.out.print("Geben Sie eine Zahl ein: ");
          int tipp = scanner.nextInt();
          
          String ergebnis = dasDotCom.pruefDich(tipp);
          anzahlTipps++;
          
          if (ergebnis.equals("Versenkt")) {
            lebt = false;
            System.out.println("Sie haben " + anzahlTipps + " Versuche benötigt!");
          } // end of if
        } // end of while
      }
}
 

Neue Themen


Zurück
Oben