Самый короткий код, чтобы бросить IllegalArgumentException в Java


21

Окей, мы все знаем нормальный способ вызвать исключение IllegalArgumentException в Java:

throw new IllegalArgumentException(); // 37 characters

Но должны быть более короткие (как в меньшем количестве символов) способы сделать это. Как мы можем создать исключение java.lang.IllegalArgumentException с еще меньшим количеством кода?

  • Фрагмент кода должен компилироваться и запускаться в Java 7.
  • Нет импорта / внешних пакетов (например, не используется java.util.Arrays.toString())
    • Единственное исключение: java.lang, потому что он автоматически импортируется.
  • Вы можете добавить собственные методы / классы.
  • Это должно бросить java.lang.IllegalArgumentException
    • Редактировать: вывод ошибки (stacktrace) должен называться java.lang.IllegalArgumentException, поэтому его подклассов нет.

Чтобы иметь базу, чтобы начать с:

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

Ответы:


29

Все они были найдены с помощью grepping исходного кода в пакете java.lang.

Все они приводят к «чистому» IllegalArgumentException(то есть не его подклассу).

Помеченные *только работают, если вы добавляете " throws Exception"(18 символов) к вашему mainобъявлению, так как они выбрасывают какое-то проверенное исключение.

12 (30?) Символов *

"".wait(-1);

Это приведет к:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Символов *

new Thread().join(-1);

22 персонажа

Character.toChars(-1);

30 персонажей

Character.UnicodeBlock.of(-1);

Нет, он не скомпилируется, потому что он может выбросить InterruptedException.
везение

1
Компилятор выдаст ошибку:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald

1
К сожалению, Ideone автоматически добавляет throws Exceptionк mainметоду. Я добавил заметку в своем посте.
Дверная ручка

1
Mwhahaha! Мне удалось найти свою IllegalArgumentExceptionпамять. Нет необходимости в таких инструментах, как grep. За исключением измененных правил сделать его недействительным. :-(
Джастин

1
@usr Нет; примитивы не являются объектами в Java.
Дверная ручка

23

Вот хороший короткий способ сделать это в 17 13 символов :

new Long("");

Это бросает NumberFormatException, который является IllegalArgumentException. Это и это подтверждают это.

Эквивалентно, можно сделать

new Byte("");

Извините, уточнил, что я ищу: я ищу "чистое" исключение IllegalArgumentException. Это следует назвать так.
luckydonald

@luckydonald, что вы подразумеваете под "именованием"? Тип, указанный в стековой трассировке? Если это так, было бы приемлемым исключение с причиной, если IllegalArgumentException был передан внутри как причина для другого исключения?
Восстановить Монику - Sep--

Цель состоит в том, чтобы заменить нормальный бросок новым IAE (). Код при выполнении в статическом (основном) методе должен завершиться ошибкой Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). В случае неудачи (строка, файл, трассировка стека) не имеет значения.
luckydonald

10

22 персонажа:

Character.toChars(-1);

Запуск примера
Javadoc: java.lang.Character.toChars (int)

Несколько симпатичных вариантов:

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

~iтак же, как -1 * (i+1)потому что он инвертирует биты. Таким образом, мы получим недопустимый параметр, потому что он меньше 0.
1<<7создаст слишком большое число, сдвинув 1 в семь раз. (так же, как умножить это на 7 раз с 2). Последнее принятое значение, похоже 1114111, 1114112потерпит неудачу. Примечание: это может измениться в зависимости от вашей среды и может быть не всегда надежным.

См. Документы Oracle "Операторы побитового и битового сдвига" и "Примитивные типы данных".

28 символов:

И если вам не нравится использовать класс персонажей в соревновании по подсчету персонажей *:

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

*) Просто чтобы сделать этот каламбур.


Не нужно быть позитивным; Вы можете делать любые неотрицательные (то есть ~0работает тоже)
Джастин

Я думал о 0 как о положительном, потому что у него нет минуса. Но ваше право и даже Character.toChars(~-0); работает.
luckydonald

4
~ 0 это -1. Не уверен, что ~ -0 делает для вас, кроме необходимости дополнительного символа.
alex.forencich

Это выглядит смешнее xD
luckydonald

8

21 персонаж:

System.getProperty("");

Согласно документации, getPropertyи setPropertyбросьте, IllegalArgumentExceptionесли ключ пуст.


5

25 персонажей

Создает вектор с недопустимой (отрицательной) длиной:

new java.util.Vector(-1);

Вывод:

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

Вот 24 символа:

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

Это бросит IllegalFormatException, который является IllegalArgumentException.


1

19 символов:

String.format("%");

Броски java.util.UnknownFormatConversionException, которые наследуются от IllegalFormatException, которые, в свою очередь, наследуются от IllegalArgumentException;


1

14 персонажей

this.wait(-1);

17 персонажей

Thread.sleep(-1);

Что касается кода, который напрямую генерирует исключение IllegalArgumentException, то он это сделает.

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

прямой код равен 17 символам, если вы суперприклиниваете и подсчитываете символы, чтобы добавить предложение throws для перехваченного исключения, вы можете сократить его, просто бросив необработанный класс Exception


1
this.wait(-1)не работает в основной функции, из-за основного существа static.
luckydonald

Thread.sleep(-1)требует, чтобы вы добавили объявление throws в функцию, чтобы оно снова стало длиннее. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.