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?
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.
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.
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.
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:
Person
zu einer Liste namens postalCodes
hinzu.
Tags und Links java list add illegalargumentexception