• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

probleme mit java.util.*

Hallo!

ich arbeite mit suse 9.2, habe java 1.5 am laufen und benutze als compiler blueJ.
Mein Problem:
ich möchte eine ArrayList verwenden; wenn ich die methode add aufrufe bringt er aber ebim übersetzen eine Fehlermeldung dass er die methode add nicht kennt obwohl java.util.* importiert wurde. Nun habe ich die Lösung unseres Informatikdozenten angeschaut und versucht zu übersetzen aber auch dort kommt die Fehlermeldung. Auf seinem Rechner funktioniert es aber.
Falls jemand einen Vorschlag hätte wär ich sehr dankbar.

Danke
 

timomeinen

Member
Vielleicht liegt das Problem an dem 1.5-er JDK, da hier ja bei Listen die Generics eingeführt wurden.

Welche Fehlermeldung kommt denn genau?

Meine Vorschläge sind:
  1. Mal ausprobieren, ob es mit Generics läuft, also ArrayList<String> myList = new usw...
  2. Ein älteres JDK verwenden.
 
OP
4

49er_sailer

Newbie
hi!
also die classpath variablen sind gesetzt.
des komisch is dass es bei einem bekannten funktioniert der hat den selben compiler und die selbe linux veriosn und jdk version.
anfangs dachte ich es liegt komplett daran dass er einfach die java.util nicht erkennt nun habe ich einfach mal getesten was passiert wenn ich import java.util.* weg mach dann bringt er aber gleich dass er die methode ArrayList() und List() nicht kennt. mache ich impoert java.util.* weider hin erkennt er wenigstens das nur wenn ich .add(..) ausführen bzw übersetzen will.....hier mal der quelltext:

import java.util.*;

public class test{
public static void main(String[] arg){


ArrayList lst= new ArrayList();
for(int i=-5; i<=5; i++){
lst.add(i);}

}}

die Fehlermeldung: cannot resolve symbol - method add(i)

:-( komisch :-( aber falls jemand ideen dazu hat .....

danke im vorraus
 

timomeinen

Member
Dein Problem ist ganz leicht gelöst:

Die ArrayList erwartet als Parameter ein Object. Da du versuchst einen int zu übergeben kommt die Fehlermeldung. Du musst einfach die Wrapper-Klasse Integer nehmen.

Code:
lst.add(new Integer(i));

Wenn du die Objekte wieder aus der ArrayList holst, handelt es sich wieder um Objekte! Das heisst, du musst einen Cast durchführen:

Code:
Integer ergebnis = (Integer)lst.get(0);

Möchtest du wieder einen int haben, musst du dir noch den intValue() holen:

Code:
int ergebnisAlsInt = ergebnis.intValue();

Die Fehlermeldung ist irreführend. Normalerweise kommt diese Meldung:

Code:
The method add(int, Object) in the type ArrayList is not applicable for the arguments (int).
 

TeXpert

Guru
also an dem Integer dürfte es nicht liegen, da java afair eine automatische Konversion der primitiven Typen ermöglich.


ich ahb das spasseshalber gerade mal ausprobiert (ich hab auf der Workstation gerade gestern das neuese SDK installiert :) und da bekomme ich das nicht mal kompiliert:
Code:
$ javac test.java
Note: test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

mit dem non-Std-Op gehts dann:
Code:
$ javac -Xlint:all test.java
test.java:9: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
lst.add(i);}
       ^
1 warning
XX@YY:~/tmp/j$ java test
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
ich hab nur noch ein System.out.println(lst);
hinten dran gehängt.


dazu schreibt java dann noch auf irgendeiner tutorial seite:
Though the code is correct, these warnings indicate that the compiler can't guarantee the correctness of the operations, the way it can when using collections whose types are specified throughout. Whenever you get an unchecked warning, you should verify that the operation that gives rise to the warning is really correct.


ach ja, um das Programm korrekt mit den Generics zu benutzen, sollte es also so aussehne:

Code:
import java.util.*;

public class test{
public static void main(String[] arg){


ArrayList<Integer> lst= new ArrayList<Integer>();
for(int i=-5; i<=5; i++){
lst.add(i);}

System.out.println(lst);
}}
 

timomeinen

Member
Unchecked funktioniert wohl mit dem 1.5-er JDK. Allerdings sollte man dies nicht machen, da so der Compiler nicht überprüfen kann, ob gültige (=korrekt gecastete) Objekte verarbeitet werden. Daher sollte man auf jeden Fall die Wrapper-Klasse Integer verwenden oder wahlweise bei einem JDK >= 1.5 auf Generics setzen.
 

TeXpert

Guru
timomeinen schrieb:
Unchecked funktioniert wohl mit dem 1.5-er JDK. Allerdings sollte man dies nicht machen, da so der Compiler nicht überprüfen kann, ob gültige (=korrekt gecastete) Objekte verarbeitet werden. Daher sollte man auf jeden Fall die Wrapper-Klasse Integer verwenden oder wahlweise bei einem JDK >= 1.5 auf Generics setzen.

prinzipiell richtig, aber in den Fällen wo es keine Generics gibt sollte man ab 1.5 auch nicht mehr selber mit Integers rumhampeln, das automatische boxing und unboxing erledigt das perfekt
 

timomeinen

Member
TeXpert schrieb:
das automatische boxing und unboxing erledigt das perfekt

Was passiert mit den Warnungen? Ich hoffe nicht, dass sie ignoriert werden. :D

Also wenn man schon mit dem 1.5 arbeitet, dann sollte man Generics nehmen, auch wenn es nur für den Stil ist.

Auf jeden Fall dürfte das java.util. Problem gelöst sein und es kann oben ein Haken gesetzt werden.
 

TeXpert

Guru
timomeinen schrieb:
TeXpert schrieb:
das automatische boxing und unboxing erledigt das perfekt

Was passiert mit den Warnungen? Ich hoffe nicht, dass sie ignoriert werden. :D

nein, es gibt keien Warnungen mehr, durch das autoboxing passiert das Integer<->int konvertieren automatisch (natürlich nur bei entsprechenden Datentypen)

http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
 

timomeinen

Member
Oh cool - danke für den Link. Ich arbeite noch immer mit dem 1.4.2 JDK. Da wirds wohl langsam wirklich Zeit zu wechseln. Mal schauen, wie weit Eclipse mit dem 1.5-er ist.
 
Oben