Kürzester Code zum Auslösen von IllegalArgumentException in Java

21

Okey, wir alle kennen den normalen Weg, eine IllegalArgumentException in Java auszulösen:

throw new IllegalArgumentException(); // 37 characters

Es muss jedoch eine kürzere (wie bei weniger Zeichen) Möglichkeit geben, dies zu tun. Wie können wir eine java.lang.IllegalArgumentException mit noch weniger Code erzeugen?

  • Das Codefragment muss in Java 7 kompiliert und ausgeführt werden.
  • Keine Importe / Fremdverpackungen (zB nicht verwenden java.util.Arrays.toString())
    • einzige ausnahme: java.lang da es automatisch importiert wird.
  • Sie können eigene Methoden / Klassen hinzufügen.
  • Es muss eine java.lang.IllegalArgumentException auslösen
    • Bearbeiten: Die Fehlerausgabe (Stacktrace) muss java.lang.IllegalArgumentException heißen, also keine Unterklassen davon.

Eine Basis haben, von der aus man beginnen kann:

class Titled {
    public static void main(String[] args) {
        throw new IllegalArgumentException();
    }
}
Glückwunsch
quelle

Antworten:

29

Diese wurden alle durch grepPingen des Quellcodes im Paket gefunden java.lang.

Sie alle ergeben eine "reine" IllegalArgumentException(dh keine Unterklasse davon).

Die markierten *funktionieren nur, wenn Sie " throws Exception"Ihrer mainDeklaration (18 Zeichen) hinzufügen , da sie eine aktivierte Ausnahme auslösen.

12 (30?) Zeichen *

"".wait(-1);

Dies führt zu:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Zeichen *

new Thread().join(-1);

22 Zeichen

Character.toChars(-1);

30 Zeichen

Character.UnicodeBlock.of(-1);
Türknauf
quelle
Nein, es wird nicht kompiliert, da es einen werfen kann InterruptedException.
Luckydonald
1
Der Compiler wird einen Fehler machen:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
1
Hoppla, Ideone ergänzt throws Exceptiondie mainMethode automatisch . Ich habe eine Notiz in meinen Beitrag eingefügt.
Türklinke
1
Mwhahaha! Ich habe es geschafft, meine IllegalArgumentExceptionErinnerung zu finden . Werkzeuge wie grep sind nicht erforderlich. Außer die geänderten Regeln machen es ungültig. :-(
Justin
1
@usr Nein; Grundelemente sind in Java keine Objekte.
Türklinke
23

Hier ist ein schöner kurzer Weg, um es in 17 13 Zeichen zu tun :

new Long("");

Es wirft eine NumberFormatException, die eine ist IllegalArgumentException. Dies und das bestätigen es.

Genauso könnte man es tun

new Byte("");
Justin
quelle
Entschuldigung, klargestellt, wonach ich suche: Ich suche eine "saubere" IllegalArgumentException. Es sollte es so benennen.
Luckydonald
@luckydonald was meinst du mit "benennen"? Der im Stacktrace angegebene Typ? Wenn ja, wäre eine Ausnahme mit Ursache akzeptabel, wenn die IllegalArgumentException intern als Ursache an eine andere Ausnahme übergeben würde?
Wiedereinsetzung von Monica - ζ--
Der Zweck ist es, die normale Wurf neue IAE () zu ersetzen. Wenn der Code in einer statischen (Haupt-) Methode ausgeführt wird, muss er fehlschlagen Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Wo es fehlschlägt (Zeile, Datei, Stacktrace) spielt keine Rolle.
Luckydonald
10

22 Zeichen:

Character.toChars(-1);

Beispiel
Javadoc ausführen: java.lang.Character.toChars (int)

Einige gut aussehende Varianten:

Character.toChars(~4); // 22 characters, number can be any non-negative (and -0)
Character.toChars(1<<7); // 24 characters

~iist das gleiche wie, -1 * (i+1)weil es die Bits invertiert. Wir erhalten also einen ungültigen Parameter, da dieser kleiner als 0
1<<7ist. Durch siebenmaliges Verschieben der 1 wird eine zu hohe Zahl erzeugt. (Wie 7 mal mit 2 multiplizieren). Der zuletzt akzeptierte Wert scheint zu sein 1114111, 1114112wird fehlschlagen. Hinweis: Dies kann sich je nach Ihrer Umgebung ändern und ist möglicherweise nicht immer zuverlässig.

Weitere Informationen finden Sie in den Oracle-Dokumenten "Bitweise Operatoren und Bitverschiebungsoperatoren" und "Primitive Datentypen".

28 Zeichen:

Und wenn Sie die Charakterklasse nicht gerne in einem Charakterzählwettbewerb verwenden *:

Enum.valueOf(Enum.class,""); // 28 characters

*) Nur um dieses Wortspiel zu machen.

Glückwunsch
quelle
Muss nicht positiv sein; Sie können alle nicht-negativ (dh ~0funktioniert auch)
Justin
Ich dachte über 0 als positiv, weil es kein Minus hat. Aber du hast Recht und Character.toChars(~-0); funktioniert sogar .
Luckydonald
4
~ 0 ist -1. Nicht sicher, was ~ -0 für Sie bedeutet, außer dass Sie ein zusätzliches Zeichen benötigen.
alex.forencich
Es sieht lustiger aus xD
luckydonald
8

21 Zeichen:

System.getProperty("");

Wie in der Dokumentation beschrieben, getPropertyund setPropertywerfen, IllegalArgumentExceptionwenn der Schlüssel leer ist.

ApproachingDarknessFish
quelle
5

25 Zeichen

Erstellt einen Vektor mit einer ungültigen (negativen) Länge:

new java.util.Vector(-1);

Zeigt an:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal Capacity: -1
    at java.util.Vector.<init>(Vector.java:129)
    at java.util.Vector.<init>(Vector.java:144)
    at Titled.main(Titled.java:3)
David
quelle
1

Hier sind 24 Zeichen:

System.out.printf("%z");

Dies wirft eine IllegalFormatException, die eine ist IllegalArgumentException.

AJMansfield
quelle
1

19 Zeichen:

String.format("%");

Würfe java.util.UnknownFormatConversionException, von denen erbt, von IllegalFormatExceptiondenen erbt IllegalArgumentException;

cPu1
quelle
1

14 Zeichen

this.wait(-1);

17 Zeichen

Thread.sleep(-1);

In Bezug auf Code, der direkt eine IllegalArgumentException auslöst, ist dies der Fall.

From documentation: 
Thread.sleep(int millis): 
Throws:IllegalArgumentException - if the value of millis is negative
InterruptedException - if any thread has interrupted the current thread. 

Der direkte Code besteht also aus 17 Zeichen. Wenn Sie ein Super-Stickler sind und die Zeichen zählen, um eine Throws-Klausel für die unterbrochene Ausnahme hinzuzufügen, können Sie sie durch einfaches Auslösen der Raw-Exception-Klasse verkürzen

jpcoder
quelle
1
this.wait(-1)funktioniert nicht in der Hauptfunktion, aufgrund von Hauptfunktion static.
Luckydonald
Thread.sleep(-1)erfordert, dass Sie der Funktion eine Throws-Deklaration hinzufügen, damit sie wieder länger wird. error: unreported exception InterruptedException; must be caught or declared to be thrown
Luckydonald