El código más corto para lanzar IllegalArgumentException en Java


21

Okey, todos sabemos la forma normal de lanzar una IllegalArgumentException en Java:

throw new IllegalArgumentException(); // 37 characters

Pero debe haber una forma más corta (como en menos caracteres) de hacerlo. ¿Cómo podemos producir una excepción java.lang.IllegalArgumentException con aún menos código?

  • El fragmento de código tiene que compilarse y ejecutarse en Java 7.
  • Sin importaciones / paquetes externos (por ejemplo, sin usar java.util.Arrays.toString())
    • única excepción: java.lang porque se importa automáticamente.
  • Puede agregar sus propios métodos / clases.
  • Debe arrojar una java.lang.IllegalArgumentException
    • Editar: la salida de error (stacktrace) debe nombrarla java.lang.IllegalArgumentException, por lo que no hay subclases de la misma.

Para tener una base para comenzar:

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

Respuestas:


29

Todo esto se encontró haciendo grepping al código fuente en el paquete java.lang.

Todos ellos resultan en un "puro" IllegalArgumentException(es decir, no una subclase de la misma).

Los marcados *solo funcionan si agrega " throws Exception"(18 caracteres) a su maindeclaración, ya que arrojan una excepción marcada de algún tipo.

12 (30?) Caracteres *

"".wait(-1);

Esto resultará en:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Caracteres *

new Thread().join(-1);

22 caracteres

Character.toChars(-1);

30 caracteres

Character.UnicodeBlock.of(-1);

No, no se compilará porque puede arrojar un InterruptedException.
luckydonald

1
El compilador producirá un error:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald

1
Vaya, Ideone agrega automáticamente throws Exceptional mainmétodo. He añadido una nota en mi publicación.
Pomo de la puerta

1
Mwhahaha! Logré encontrar mi IllegalArgumentExceptionde memoria. No hay necesidad de herramientas como grep. Excepto que las reglas cambiadas lo hacen inválido. :-(
Justin

1
@usr No; Las primitivas no son objetos en Java.
Pomo de la puerta

23

Aquí hay una pequeña forma de hacerlo, en 17 13 caracteres :

new Long("");

Lanza un NumberFormatException, que es un IllegalArgumentException. Esto y esto lo verifican.

Equivalentemente, uno podría hacer

new Byte("");

Lo sentimos, he aclarado lo que estoy buscando: estoy buscando una excepción 'ilegal' de argumento ilegal. Debería nombrarlo así.
luckydonald

@luckydonald, ¿qué quieres decir con "nombrar"? ¿El tipo dado en el stacktrace? Si es así, ¿sería aceptable una excepción con causa si la IllegalArgumentException se pasa internamente como la causa a otra excepción?
Restablece a Monica - ζ--

El propósito es reemplazar el lanzamiento normal nuevo IAE (). El código, cuando se ejecuta en un método estático (principal) tiene que fallar Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Si falla (línea, archivo, stacktrace) no importa.
luckydonald

10

22 caracteres:

Character.toChars(-1);

Ejecutando
Javadoc de ejemplo : java.lang.Character.toChars (int)

Algunas variantes bonitas:

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

~ies lo mismo que -1 * (i+1)porque invierte los bits. Entonces obtendremos un parámetro ilegal, porque es más pequeño que 0.
1<<7creará un número demasiado alto al cambiar el 1 siete veces. (lo mismo que multiplicarlo 7 veces por 2). El último valor aceptado parece ser 1114111, 1114112fallará. Nota: esto puede cambiar según su entorno y no siempre es confiable.

Consulte los "Operadores Bitwise y Bit Shift" y "Tipos de datos primitivos" de Oracle Docs.

28 caracteres:

Y si no te gusta usar la clase de personaje en una competencia de conteo de personajes *:

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

*) Solo para hacer este juego de palabras.


No necesita ser positivo; puedes hacer cualquier cosa no negativa (es decir, ~0también funciona)
Justin

Pensé en 0 como positivo porque no tiene menos. Pero tienes razón, e incluso Character.toChars(~-0); funciona.
luckydonald

44
~ 0 es -1. No estoy seguro de lo que ~ -0 hace por ti, además de requerir un personaje adicional.
alex.forencich

Parece más divertido xD
luckydonald

8

21 caracteres:

System.getProperty("");

Según la documentación, getPropertyy setPropertytirar IllegalArgumentExceptionsi la clave está vacía.


5

25 personajes

Crea un vector con una longitud no válida (negativa):

new java.util.Vector(-1);

Muestra:

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)

1

Aquí hay 24 caracteres:

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

Esto arrojará un IllegalFormatException, que es un IllegalArgumentException.


1

19 caracteres:

String.format("%");

Lanza java.util.UnknownFormatConversionException, que hereda de IllegalFormatException, que, a su vez, hereda de IllegalArgumentException;


1

14 personajes

this.wait(-1);

17 personajes

Thread.sleep(-1);

En cuanto al código que arroja directamente IllegalArgumentException, estos lo harán.

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

así que el código directo es de 17 caracteres, si estás siendo un súper adherente y estás contando los caracteres para agregar una cláusula throws para la excepción interrumpida, puedes acortarlo simplemente lanzando la clase de excepción sin procesar


1
this.wait(-1)no funciona en la función principal, debido al ser principal static.
luckydonald

Thread.sleep(-1)requiere que agregue una declaración de lanzamiento a la función, para que se vuelva a alargar. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.