Wann löst List.addAll () IllegalStateException aus?

8

Ich habe Code

%Vor%

und ich frage mich, wie es passieren kann, dass IllegalStateException geworfen wird. Es ist anscheinend einem Benutzer meiner App passiert, aber ich kann nicht verfolgen, was falsch war.

Die Dokumentation von Collection.addAll() sagt:

  

IllegalArgumentException - , wenn aufgrund von Einfügebeschränkungen nicht alle Elemente hinzugefügt werden können

Aber was sind die Einfügebeschränkungen?

Ich denke, es hängt vom genauen Typ der Sammlung ab. Ich verwende ArrayList, also überprüfen wir die Dokumente auf addAll() von List interface:

  

IllegalArgumentException - wenn eine Eigenschaft eines Elements der angegebenen Auflistung verhindert, dass es dieser Liste hinzugefügt wird

Nun, welche Elementeigenschaft könnte verhindern, dass das Element zur Liste hinzugefügt wird? Meine beiden Sammlungen sind vom selben Typ, ich sollte Nullwerte hinzufügen können.

Kann mir bitte jemand das erklären?

    
Marcel Bro 22.07.2015, 11:07
quelle

4 Antworten

1

Je nachdem, wie viele Informationen Sie vom Benutzer erhalten haben, ist dies möglicherweise nicht zu beantworten. Aber ich werde raten und meine Antwort löschen, wenn weitere Beweise ans Licht kommen, die dagegen verstoßen. :)

Angenommen, Sie haben den gesamten Code geschrieben, stimme ich zu, dass addAll() IllegalStateException nicht ausgeben kann (und das ganze Gespräch über IllegalArgumentException ist irrelevant).

Ich vermute, dass der Fehler nicht vom Aufruf addAll() stammt, sondern von einem anderen Aufruf im Code (nicht gezeigt), der versucht, eine dieser Sammlungen zu manipulieren. Es ist möglich, ein IllegalStateException zu erhalten, indem Sie beispielsweise versuchen, die Liste zu durchlaufen (indem Sie einen Iterator mit .iterator() verwenden), ein Element zu entfernen und dann zu versuchen, ein anderes Element ohne Aufruf zu entfernen %Code%. Ähnlich kann Iterator.next() einen in einen Iterator werfen, der von einem Iterator.set() erhalten wurde. Also meine Vermutung ist, irgendwo in der Liste zu manipulieren, passiert eines dieser Dinge.

Alternativ gibt es viele Möglichkeiten, wie andere Auflistungsimplementierungen eine werfen können. Wenn wir also nicht sicher sind, ob es sich um ArrayList handelt, dann haben wir sehr wenig zu tun.

    
David P. Caldwell 22.07.2015, 12:09
quelle
1

Ihr Code kann niemals IllegalArgumentException auslösen, weil ArrayList # addAll kann eine solche Ausnahme nicht auslösen.

Um diese Ausnahme zu erhalten, müssen Sie eine Klasse verwenden, die Collection implementiert, wo eine solche Ausnahme ausgelöst werden kann. Sie können dies leicht selbst machen, indem Sie die ArrayList erweitern und die beteiligten Methoden überschreiben.

    
Jose Antonio Dura Olmos 22.07.2015 11:34
quelle
0

Es hängt von der Implementierung ab. Wenn Sie die Dokumentation überprüfen > Für ArrayList , das ist die tatsächliche Klasse, die Sie verwenden, sehen Sie das.

  

Wirft:       NullPointerException - wenn die angegebene Auflistung null ist

Also sollte dein ArrayList nicht das IllegalArgumentException werfen. Wenn Sie eine andere Implementierung oder einen Wrapper verwenden würden (siehe nicht änderbare Liste , Anmerkung , dass dieses Beispiel keine solche Ausnahme auslöst), könnte es eine solche Ausnahme auslösen.

So erhalten Sie die Protokollierung von Ihrem Benutzer und versuchen, das Problem zu reproduzieren.

    
Timo 22.07.2015 11:38
quelle
0

Mir sind keine Implementierungen (in der JRE oder irgendeiner Bibliothek) bekannt, die eine IllegalArgumentException auslösen.

Aber Sie könnten leicht Ihre eigene Implementierung erstellen, die eine solche Ausnahme auslöst. Die Schnittstelle Collection macht die Benutzer darauf aufmerksam, dass ein Implementor ein IllegalArgumentException verwenden kann - es sagt nicht, dass die Implementierer es tatsächlich benutzen

>

Ein Beispiel:

%Vor%

Als Ergebnis würde ich diesen Ansatz empfehlen:

  • Überprüfen Sie Ihren Code, dass Sie Ihrer Sammlung semantisch sinnvolle Elemente hinzufügen. Fügen Sie keine Objekte der Klasse Person zu einer Liste namens postalCodes hinzu.
  • behandelt jede technische Laufzeitausnahme auf geeignete Weise . Zum Beispiel Rollback-Transaktionen, protokollieren, informieren Sie den Benutzer und / oder das Support-Team
  • Berücksichtigen Sie Anrufer Ihrer Methode informieren (über JavaDoc), dass Ihre Methode fehlschlagen könnte
slartidan 22.07.2015 11:28
quelle