PDA

View Full Version : [FRAGE] - Fehlermeldung: Object statt String


Vench
28-12-2004, 02:37
Ich hab ein Programm, das beim Kompilieren folgende Meldung anzeigt:


Probe5.java:102: incompatible types
found : java.lang.Object
required: java.lang.String
punkt = b.get(i);
^
Probe5.java:129: incompatible types
found : java.lang.Object
required: java.lang.String
punkt = c.get(i);
^
Note: Probe5.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errorsKann mir jemand erklären, wie ich diese(n) Fehler beheben kann (es scheint ja 2mal das gleiche Problem zu sein)?
Wenn ich's richtig verstanden habe, ist das Problem, dass .get ein Object zurück gibt, punkt jedoch ein String ist. Könnte ich vielleicht mit parseString arbeiten (falls es das überhaupt gibt)?

Die Notes beachte ich einfach nicht weiter - Ist das ok?

Hier der vollständige Code:
(Ich erwarte allerdings nicht ernsthaft, dass jemand das alles wirklich liest ;) )



import eprog.*;
import java.util.*;

public class Probe5 {

//main-Methode: deklariert den String eingabe und gibt auf Bildschirm das aus, was
// sie aus der Methode (Umwandlung) erhaelt.
// Sie beinhaltet ausserdem den try-catch-Block
public static void main(String[] args) {

try {
String eingabe = new String();
EprogIO.println(Umwandlung(eingabe));
}
catch (Exception e) {
EprogIO.println("FALSCHE EINGABE");
System.exit(0);
}
}

//Methode Umwandlung wandelt die ArrayList aus ... in einen String um.
static String Umwandlung(String eingabe) {
ArrayList al = entklammern(eingabe);
return(al.toString());
}


//Methode Einlesen fuellt eine ArrayList mit Eingabewerten(Strings), solange die
//Abbruchbedingung nicht erreicht ist.
//Anschließend entfernt sie en letzten Eintrag aus der ArrayList.
static ArrayList Einlesen(String eingabe) {

ArrayList punkte = new ArrayList();
String bedingung = new String();
do {
eingabe = EprogIO.readWord();
bedingung = eingabe;
punkte.add(eingabe);

} while(!AbbruchBedingung(eingabe));
int letztesElement = punkte.size() - 1;
punkte.remove(letztesElement);
return(punkte);
}

//AbbruchBedingung: hier wird überprüft, ob gerade ein Gleichheitszeichen eingelesen
//wurde; falls ja, wird die boolean Variable Abbruch auf true gesetzt.
static boolean AbbruchBedingung(String eingabe) {

boolean Abbruch = false;
if (eingabe.equals("=")) {
Abbruch = true;
}
return(Abbruch);
}

//passendePunktanzahl: Sind auch tatsaechlich zwischen 3 und 15 Punkte eingegeben worden?
//wenn nicht, so wird "FALSCHE EINGABE" ausgegeben und das Programm endet an dieser Stelle

static ArrayList passendePunktanzahl(String eingabe) {
ArrayList a = Einlesen(eingabe);
if(a.size()<3 || a.size()>15) {
EprogIO.println("FALSCHE EINGABE");
System.exit(0);
}
return(a);
}

//korrekteKlammerung: gibt folgendes zuruck: true falls alles passt bzw. false falls
//irgendwelche ArrayList-Elemente nicht "umklammert" sind.
static boolean korrekteKlammerung(String eingabe) {

boolean klammersetzung;
ArrayList b = passendePunktanzahl(eingabe);
int count = b.size();
for (int i=0;i<count;i++) {
String punkt = b.get(i);
while(punkt.startsWith("(") && punkt.endsWith(")") && (punkt.length()>=5)) {
klammersetzung = true;
}
}
return klammersetzung;
}


// entklammern entfernt die Klammern um die Punkte (falls korrekt geklammert ist).
static ArrayList entklammern(String eingabe) {

ArrayList c = new ArrayList();

if (korrekteKlammerung(eingabe)) {
c = passendePunktanzahl(eingabe);
}
else {
EprogIO.println("FALSCHE EINGABE");
System.exit(0);
}

int count = c.size();
for (int i=0;i<count;i++) {
String punkt = c.get(i);
punkt = punkt.substring(1, punkt.length()-1);
c.set(i, punkt);
}
return(c);
}

}

Keine Ahnung, wieso der Code hier so sonderbar formatiert ist - in meinem Editor wars noch anders.


lg, Vench

Paulchen
28-12-2004, 11:32
Ich nehme an, du hast in deinem Programm ein Problem mit der ArrayList, in der du Objekte eines beliebigen Typs speichern kannst. Ein einfaches Beispiel für die Verwendung einer ArrayList könnte wie folgt aussehen:

String Eingabe = EprogIO.readWord();
ArrayList Eingaben = new ArrayList();
while(Eingabe != "=") {
Eingaben.add(Eingabe);
Eingabe = EprogIO.readWord();
}

for(int a=0;a<Eingaben.size();a++)
EprogIO.println((String)Eingaben.get(a));

Dieser Code liest über die EprogIO so lange Worte ein, bis ein "=" eingegeben wird; dann wird alles, was zuvor eingegeben worden ist, jeweils durch Zeilenumbrüche getrennt, ausgegeben. Wichtig ist hier, dass der Wert, den Eingaben.get() zurückliefert mit Hilfe von (String) in einen String gecastet wird, damit der Java-Compiler weiß, dass es sich hier um einen String handeln soll.

Verwendest du Java 1.5, so wird dir beim Compilieren die von dir schon bemerkte Warnung ausgegeben werden. Ohne jetzt näher darauf einzugehen, warum das so ist, kannst du den Code abändern, so dass du erhältst:

String Eingabe = EprogIO.readWord();
ArrayList<String> Eingaben = new ArrayList<String>();
while(Eingabe != "=") {
Eingaben.add(Eingabe);
Eingabe = EprogIO.readWord();
}

for(int a=0;a<Eingaben.size();a++)
EprogIO.println(Eingaben.get(a));

Hier gibst du bereits in der zweiten Zeile an, Werte welchen Datentyps in der ArrayList gespeichert werden. Dadurch gibt Eingaben.get() auch einen String zurück, diese Rückgabe muss nicht mehr gecastet werden.
Das hat den Zweck, dass bereits der Compiler überprüfen kann, ob die Datentypen im Programm stimmen. So wird bereits beim Compilieren ein Fehler ausgegeben, wenn du in eine ArrayList, welche nur Integer speichern kann, einen String zu speichern versuchst.

duracell
28-12-2004, 13:46
Paulchen spricht damit die seit 1.50 eingeführte Generizität an. Da gabs schon 1 oder 2 Threads dazu:

http://www.informatik-forum.at/showthread.php?t=25980
http://www.informatik-forum.at/showthread.php?t=25738

Vench
28-12-2004, 15:20
Danke für die Hilfe!

Wenn ich alles richtig verstanden habe, geht also einfach darum, dass ich irgendwo angeben muss, dass die ArrayList nicht bloss irgendwelche Objekte, sondern Strings enthalten soll. - und wenn ich das von Anfang an zur ArrayList dazuschreib, kommen auch die Warnungen nicht mehr.


Paulchen spricht damit die seit 1.50 eingeführte Generizität an. Da gabs schon 1 oder 2 Threads dazu:
Auf diese Threads bin ich sogar schon gestossen, ich konnte allerdings nur herauslesen, dass die Warungen ziemlich egal sind; nicht aber wie man sie wegbekommt bzw. wieso sie in meinem Fall auftreten. Das dürfte jetzt aber auch geklärt sein.
mfg thx!