Fehlersuche

DaSt

Bekanntes Mitglied
Hallo,
ich habe hier eine Prüfung aus dem letzten Jahr und in folgendem Code ist (noch) ein Fehler, den ich nicht finde.. könnt ihr mir helfen.

Java:
import java.util.ArrayList;
import java.util.List;

public class Main {
   public static void main(String[] args) {
     List<Integer> list = new ArrayList<>();

     for(Integer element :list){
       if(element>10){
         list.remove(element);
         System.out.println("Removed");
       } 
     }
   }
}

Also ich würde sagen, die if-Abfrage stimmt so nicht, da die Variable "element" ja ein Objekt ist und ich das mit einer int Zahl vergleiche.

und bei list.remove() muss man doch die Stelle übergeben, die man löschen will oder?

Danke
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Also die Fehler die ich hier sehe sind:
- Liste ist leer
- ConcurrentModificationException, weil du während der Iteration ein Element löscht (würde man mit einem Iterator vermeiden)

Deine Aussagen sind allesamt falsch:
- if passt (da Autoboxing)
- list.remove(int) würde an der Position löschen list.remove(Object) resp. list.remove(Integer) löscht das Objekt, aber nicht an der aktuellen Stelle, sondern an der Ersten.
- Exception würde fliegen, wegen siehe oben!

Aber was war die eigentliche Prüfungsfrage?
 

DaSt

Bekanntes Mitglied
Aber was war die eigentliche Prüfungsfrage?

"in Folgender Klasse sind zwei Fehler enthalten. Nennen Sie die beiden Fehler und begründen Sie ihre Wahl"

der Originalcode lautet:

Java:
import java.util.List;

public class Main {
   public static void main(String[] args) {
     List<Integer> list =new Int[10];
     for(Integer element :list){
       if(element>10){
         list.remove(element);
         System.out.println("Removed");
       }
     }
   }
}
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Ja das Erste ist klar, das es erstens kein Typ Int gibt und zweitens, dass diese nicht einer List zugeordnet werden können.

Das andere wie schon gesagt würde dir eine ConcurrentModificationException werfen (nicht in allen Fällen, aber in den meisten!).

Beispiel mit Exception:
Java:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 10, 20, 30, 100));

for (Integer element : list) {
  if (element > 10) {
    list.remove(element);
    System.out.println("Removed");
  }
}

Beispiel ohne Exception:
Java:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 10, 20, 30));

for (Integer element : list) {
  if (element > 10) {
    list.remove(element);
    System.out.println("Removed");
  }
}

EDIT: Das letzte Beispiel liefert dir zwar keinen Fehler, aber hat unvorhersehbare Ergebnisse, die auch falsch sind
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Ja das Erste ist klar, das es erstens kein Typ Int gibt und zweitens, dass diese nicht einer List zugeordnet werden können.

Das andere wie schon gesagt würde dir eine ConcurrentModificationException werfen (nicht in allen Fällen, aber in den meisten!).

Beispiel mit Exception:
Java:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 10, 20, 30, 100));

for (Integer element : list) {
  if (element > 10) {
    list.remove(element);
    System.out.println("Removed");
  }
}

Beispiel ohne Exception:
Java:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 10, 20, 30));

for (Integer element : list) {
  if (element > 10) {
    list.remove(element);
    System.out.println("Removed");
  }
}

Erklärst Du mir gerade mal den Unterschied zwischen dem ersten und dem zweiten Beispiel? Kann sein das es an dem fehlenden Kaffee liegt aber ich sehe da einfach keinen.

Gruß

Claus
 

Elenteria

Bekanntes Mitglied
- list.remove(int) würde an der Position löschen list.remove(Object) resp. list.remove(Integer) löscht das Objekt, aber nicht an der aktuellen Stelle, sondern an der Ersten.
hier muss ich Flown wiedersprechen. list.remove(Integer) ist aufgrund des Autoboxings mit list.remove(int) gleichzusetzten und löscht das Element am Index welcher im Integer steht. Dadurch wäre in deinem Code auch noch eine potenzielle ArrayIndexOutOfBoundsException vorhanden.
 

Flown

Administrator
Mitarbeiter
Erklärst Du mir gerade mal den Unterschied zwischen dem ersten und dem zweiten Beispiel? Kann sein das es an dem fehlenden Kaffee liegt aber ich sehe da einfach keinen.
Hat nur was mit den Values zu tun. Bei der einen fliegt die CME bei der anderen nicht.

hier muss ich Flown wiedersprechen. list.remove(Integer) ist aufgrund des Autoboxings mit list.remove(int) gleichzusetzten und löscht das Element am Index welcher im Integer steht. Dadurch wäre in deinem Code auch noch eine potenzielle ArrayIndexOutOfBoundsException vorhanden.
Nope es wird definitiv list.remove(Object) aufgerufen!

Es würde das remove mit dem Index aufgerufen werden, wenn du in der foreach Autoboxing hättest: for(int element : list) {...}. Aber nachdem Integer ein Object ist, wird die andere Methode bedient!
 

Joose

Top Contributor
Soll heissen ich kann dem Iterator sein aktuelles Objekt unter dem Arsch wegziehen wenn es nicht das letzte ist?

Dachte auch nicht das es geht, habe es aber gerade ausprobiert und es stimmt wirklich. :confused:

Hat nur was mit den Values zu tun. Bei der einen fliegt die CME bei der anderen nicht.

Meiner Meinung nach funktioniert es eben nur wenn der vorletzte Value entfernt wird. Daher finde ich es ungeeigent zu sagen das man einfach "remove" aufrufen kann in einer foreach Schleife.
 

Flown

Administrator
Mitarbeiter
Es funktioniert auch nur, wenn das vorletzte Element gelöscht wird!
Eigentlich wollte ich damit ausdrücken, dass man ohne Iterator unvorhergesehene Ergebnisse (auch ohne Fehlermeldung) erhalten kann und wollte verdeutlichen, dass das ein Fehler ist!
Soll heissen ich kann dem Iterator sein aktuelles Objekt unter dem Arsch wegziehen wenn es nicht das letzte ist?
Sein letztes Element, nicht das aktuelle, aber ja!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Fehlersuche-kann mir jemand helfen? Java Basics - Anfänger-Themen 46
T Fehlersuche Java Basics - Anfänger-Themen 12
A Fehlersuche Java Basics - Anfänger-Themen 2
MR._FIRE_Flower Programm Fehlersuche Java Basics - Anfänger-Themen 16
T Hilfe bei der Fehlersuche Java Basics - Anfänger-Themen 23
S brauche hilfe bei Fehlersuche Java Basics - Anfänger-Themen 7
1 Fehlersuche Java Basics - Anfänger-Themen 4
C Fehlersuche Adressbuch *Anfänger* Java Basics - Anfänger-Themen 5
L ReplaceALL - Fehlersuche Java Basics - Anfänger-Themen 11
A Java Fehlersuche Java Basics - Anfänger-Themen 2
N Hoffnungslose Fehlersuche Java Basics - Anfänger-Themen 11
I Anfängerfrage: Fehlersuche Java Basics - Anfänger-Themen 2
S Fehlersuche(NullPointerException) Java Basics - Anfänger-Themen 5
S Fehlersuche bzw beheben Java Basics - Anfänger-Themen 9
P Fehlersuche bzgl. Array-Keys Java Basics - Anfänger-Themen 6
N Fehlersuche Printwriter Java Basics - Anfänger-Themen 6
N Hilfe bei Fehlersuche Java Basics - Anfänger-Themen 2
B Fehlersuche bei LinkedList Java Basics - Anfänger-Themen 3
w0ddes Array out of Bounds - Fehlersuche Java Basics - Anfänger-Themen 2
? hilfe bei Fehlersuche Sortierung List Java Basics - Anfänger-Themen 5
R Fehlersuche - KeyListener, KeyAdaper - Nichts Klappt! Java Basics - Anfänger-Themen 2
D Zeichen im String ändern -> Fehlersuche Java Basics - Anfänger-Themen 7
S Filereader funktioniert nicht! Fehlersuche Java Basics - Anfänger-Themen 9
S Fehlersuche Java Basics - Anfänger-Themen 6
G Fehlersuche bei einer Rechenoperation Java Basics - Anfänger-Themen 2
G Hilfe bei fehlersuche Java Basics - Anfänger-Themen 3
N Fehlersuche. Tasks Java Basics - Anfänger-Themen 14
D Fehlersuche actionPerformed Java Basics - Anfänger-Themen 6
D Fehlersuche: Jar erstellen Java Basics - Anfänger-Themen 6
B Fehlersuche Java Basics - Anfänger-Themen 4
F Fehlersuche erfolglos Java Basics - Anfänger-Themen 3
F fehlersuche. Java Basics - Anfänger-Themen 13
J Fehlersuche - illegal start of expression Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben