12

Ok, damit ich mit einer Unterschrift (Class<? extends Throwable>... exceptions) ein Verfahren bin Aufruf und ich bekomme eine hier im Hauptverfahren Warnung „File.java unkontrolliert oder unsichere Operationen verwendet“:Warum ist varargs (Klasse <? Extends Throwable> ... t) "ungeprüfte oder unsichere" Operation?

public class VarargsFun { 
    public void onException(Class<? extends Throwable>... exceptions) { } 

    public static void main(String[] args) { 
     new VarargsFun().onException(IllegalArgumentException.class); 
    } 
} 

Sollte nicht der Compiler in der Lage sein sehen Sie, dass IllegalArgumentException tatsächlich RuntimeException, Exception und Throwable verlängert?

Wie sollte ich meinen Code richtig ändern, um diese Warnung loszuwerden?

ich nicht wirklich das Gefühl, dass meine Ausnahmen Instanziieren ... es schöner zu verwenden, scheint die .class

(nicht will, @SuppressWarnings entweder verwenden!)

java ist mit 7.em Vielen Dank für alle Tipps .

+0

Sind Sie sicher, dass die Warnung von 'thenThrow' und nicht' when' kommt? Wie wird 'mockQuery' deklariert? Ist es ein Nachahmer einer generischen Klasse? –

+0

Ok Ich habe den Code in ein testbares Beispiel geändert. – vikingsteve

Antwort

11

Da Varargs eigentlich nur Arrays sind und generics and arrays don't mix (gut), hat Java traditionell eine Warnung ausgegeben, wenn Sie eine Methode mit einem generischen vararg-Typ aufrufen. Dies liegt daran, dass das Array technisch beim Aufrufer erstellt wird.

Aber es zeigte sich bald, dass Arrays erstellt ausschließlich auf eine varargs Methode übergeben werden, nicht von der gleichen Gefahr wie normale generische Arrays aus der des Anrufers Perspektive leiden hat, aber die Methode selbst, die die allgemeine Anordnung erhalten könnte missbrauchen Sie. So in Java 7 vorwärts, erscheint die Warnung auf der Methode selbst (in Ihrem Fall onException) und kann unter Verwendung der @SafeVarargs Anmerkung auf dem Verfahren unterdrückt werden:

@SafeVarargs 
public void onException(Class<? extends Throwable>... exceptions) { } 

Wenn Sie nicht in der Tat sind mit der Java 7 Sprache, oder wenn Sie nicht onException ändern kann (vermutlich, weil es sich um eine Bibliothek Methode ist), dann können Sie sicher @SuppressWarnings verwenden, um diese Warnung zu verbergen:

@SuppressWarnings("unchecked") 
public static void main(String[] args) { 
    new VarargsFun().onException(IllegalArgumentException.class); 
} 

wenn Sie Warnungen auf diese Weise jedoch unterdrücken, achten Sie darauf, zu isolieren Diese eine Aussage in ihrer eigenen Methode, damit Sie nicht versehentlich ot unterdrücken ihre zukünftigen Warnungen.

Persönlich, ich deaktivieren generische vararg Warnungen vollständig in meiner IDE, weil sie fast nie aus der Sicht des Aufrufers inkorrekten Code anzeigen.

+0

Lesen Sie Ihre Antwort erneut einschließlich des letzten Absatzes. Vielen Dank! – vikingsteve

+0

Es ist auch seltsam, dass ich auch keine Sonar-Warnungen von diesem bekomme. In jedem Fall habe ich '@SuppressWarnings (" unchecked ")' auf der Methode hinzugefügt. Danke nochmal. – vikingsteve

11

Es ist am einfachsten zu verstehen, wenn man bedenkt, dass

new VarargsFun().onException(IllegalArgumentException.class); 

für

nur syntaktischer Zucker ist
new VarargsFun().onException(
    new Class<? extends Throwable>[]{ IllegalArgumentException.class }); 

das heißt, die Aufrufstelle erstellt einen Array mit dem Komponententyp gleich den Typ des varargs.

Aber natürlich ist new Class<? extends Throwable>[] in Java nicht erlaubt. Also macht der Compiler stattdessen new Class<?>[] und gibt eine Warnung aus.

+0

Danke newacct! Ich habe Marks Antwort bereits angenommen, aber auch danke, dass du deine hinzugefügt hast. – vikingsteve

Verwandte Themen