Найкоротший код, щоб кинути 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);

Ні, він не складеться, тому що може кинути a InterruptedException.
luckydonald

1
Компілятор unreported exception InterruptedException; must be caught or declared to be thrown
помилиться

1
Упс, Ideone автоматично додає throws Exceptionдо mainметоду. Я додав замітку у своєму дописі.
Дверна ручка

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

1
@usr Ні; примітиви не є об’єктами на Java.
Дверна ручка

23

Ось хороший короткий спосіб зробити це в 17 13 символах :

new Long("");

Він кидає a NumberFormatException, який є IllegalArgumentException. Це і це підтверджують.

Що рівно, можна було б зробити

new Byte("");

Вибачте, очистив те, що я шукаю: я шукаю "чистий" IlegalgalArgumentException. Це слід назвати так.
luckydonald

@luckydonald що ти маєш на увазі під «називанням»? Тип, вказаний у стек-трасі? Якщо так, чи буде прийнятним виняток із причиною, якщо IllegalArgumentException було передано внутрішньо як причину до іншого винятку?
Відновіть Моніку - ζ--

Мета - замінити нормальний кидок новим 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


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 знаків, якщо ви супер стикер і рахуєте символи, щоб додати застереження про кидки для переключеного винятку, ви можете скоротити його, просто кинувши необроблений клас винятку


1
this.wait(-1)не працює в головній функції, через основне буття static.
luckydonald

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