Code le plus court pour lever IllegalArgumentException en Java

21

Okey, nous connaissons tous la façon normale de lever une IllegalArgumentException en Java:

throw new IllegalArgumentException(); // 37 characters

Mais il doit y avoir un moyen plus court (comme en moins de caractères) de le faire. Comment produire une java.lang.IllegalArgumentException avec encore moins de code?

  • Le fragment de code doit être compilé et exécuté en java 7.
  • Pas d'importations / packages externes (par exemple, pas d'utilisation java.util.Arrays.toString())
    • seule exception: java.lang car il est importé automatiquement.
  • Vous pouvez ajouter vos propres méthodes / classes.
  • Il doit lever une java.lang.IllegalArgumentException
    • Edit: la sortie d'erreur (stacktrace) doit la nommer java.lang.IllegalArgumentException, donc pas de sous-classes.

Pour avoir une base à partir de laquelle:

class Titled {
    public static void main(String[] args) {
        throw new IllegalArgumentException();
    }
}
luckydonald
la source

Réponses:

29

Ils ont tous été trouvés en grepexécutant une commande ping sur le code source dans le package java.lang.

Tous aboutissent à une "pure" IllegalArgumentException(c'est-à-dire pas une sous-classe).

Ceux marqués *ne fonctionnent que si vous ajoutez " throws Exception"(18 caractères) à votre maindéclaration, car ils lèvent une exception vérifiée.

12 (30?) Caractères *

"".wait(-1);

Cela se traduira par:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Caractères *

new Thread().join(-1);

22 caractères

Character.toChars(-1);

30 caractères

Character.UnicodeBlock.of(-1);
Poignée de porte
la source
Non, il ne compilera pas car il peut lancer un InterruptedException.
luckydonald
1
Le compilateur fera une erreur:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
1
Oups, Ideone ajoute automatiquement throws Exceptionà la mainméthode. J'ai ajouté une note dans mon post.
Poignée de porte
1
Mwhahaha! J'ai réussi à retrouver ma IllegalArgumentExceptionmémoire. Pas besoin d'outils comme grep. Sauf que les règles modifiées le rendent invalide. :-(
Justin
1
@usr No; les primitives ne sont pas des objets en Java.
Poignée de porte
23

Voici une belle façon de le faire, en 17 13 caractères :

new Long("");

Il jette un NumberFormatException, qui est un IllegalArgumentException. Ceci et cela le vérifient.

De manière équivalente, on pourrait faire

new Byte("");
Justin
la source
Désolé, j'ai clarifié ce que je recherche: je recherche une exception IllegalArgumentException «propre». Il devrait le nommer ainsi.
luckydonald
@luckydonald qu'entendez-vous par "nommer"? Le type donné dans le stacktrace? Dans l'affirmative, une exception avec cause serait-elle acceptable si l'exception IllegalArgumentException était transmise en interne comme cause à une autre exception?
Rétablir Monica - ζ--
Le but est de remplacer le jet normal nouveau IAE (). Le code, lorsqu'il est exécuté dans une méthode statique (principale) doit échouer Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). En cas d'échec (ligne, fichier, trace de pile), peu importe.
luckydonald
10

22 caractères:

Character.toChars(-1);

Exemple d'exécution
Javadoc: java.lang.Character.toChars (int)

Quelques belles variantes:

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

~iest le même que -1 * (i+1)parce qu'il inverse les bits. Nous obtiendrons donc un paramètre illégal, car il est plus petit que 0.
1<<7créera un nombre trop élevé en décalant le 1 sept fois. (identique à la multiplier 7 fois par 2). La dernière valeur acceptée semble être 1114111, 1114112échouera. Remarque: cela peut changer en fonction de votre environnement et peut ne pas être toujours fiable.

Voir les documents Oracle "Opérateurs de décalage de bits et de bits" et "Types de données primitifs"

28 caractères:

Et si vous n'aimez pas utiliser la classe de personnage dans une compétition de comptage de personnages *:

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

*) Juste pour faire ce jeu de mots.

luckydonald
la source
N'a pas besoin d'être positif; vous pouvez faire tout non négatif (c'est-à-dire qu'il ~0fonctionne aussi)
Justin
J'ai pensé à 0 comme positif car il n'a pas de moins. Mais tu as raison, et ça Character.toChars(~-0); marche même .
luckydonald
4
~ 0 est -1. Je ne sais pas ce que ~ -0 fait pour vous, en plus d'exiger un personnage supplémentaire.
alex.forencich
Ça a l'air plus drôle xD
luckydonald
8

21 caractères:

System.getProperty("");

Selon la documentation, getPropertyet setPropertylancez IllegalArgumentExceptionsi la clé est vide.

ApprocheObscuritéPoisson
la source
5

25 personnages

Crée un vecteur avec une longueur invalide (négative):

new java.util.Vector(-1);

Affiche:

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
la source
1

Voici 24 caractères:

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

Cela lancera un IllegalFormatException, qui est un IllegalArgumentException.

AJMansfield
la source
1

19 caractères:

String.format("%");

Jets java.util.UnknownFormatConversionException, qui hérite de IllegalFormatException, qui, à son tour, hérite de IllegalArgumentException;

cPu1
la source
1

14 personnages

this.wait(-1);

17 personnages

Thread.sleep(-1);

En ce qui concerne le code qui lève directement IllegalArgumentException, ceux-ci le feront.

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

le code direct est donc de 17 caractères, si vous êtes un super bâton et comptez les caractères pour ajouter une clause throws pour l'exception interrompue, vous pouvez la raccourcir en lançant simplement la classe d'exception brute

jpcoder
la source
1
this.wait(-1)ne fonctionne pas dans la fonction principale, en raison de l'être principal static.
luckydonald
Thread.sleep(-1)vous oblige à ajouter une déclaration throws à la fonction, donc elle rallonge. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald