Najkrótszy kod do zgłaszania wyjątku IllegalArgumentException w Javie

21

Okej, wszyscy znamy normalny sposób zgłaszania wyjątku IllegalArgumentException w Javie:

throw new IllegalArgumentException(); // 37 characters

Ale muszą istnieć krótsze (jak w mniejszej liczbie postaci) sposoby, aby to zrobić. Jak możemy stworzyć wyjątek java.lang.IllegalArgumentException z jeszcze mniejszym kodem?

  • Fragment kodu musi się skompilować i uruchomić w Javie 7.
  • Brak importu / pakietów zewnętrznych (np. Nieużywanie java.util.Arrays.toString())
    • wyjątek: java.lang, ponieważ jest on automatycznie importowany.
  • Możesz dodać własne metody / klasy.
  • Musi zgłosić wyjątek java.lang.IllegalArgumentException
    • Edycja: dane wyjściowe błędu (stacktrace) muszą nazywać się java.lang.IllegalArgumentException, więc nie można jej podać w podklasach.

Aby mieć bazę, od której można zacząć:

class Titled {
    public static void main(String[] args) {
        throw new IllegalArgumentException();
    }
}
luckydonald
źródło

Odpowiedzi:

29

Wszystkie zostały znalezione przez grep pingowanie kodu źródłowego w pakiecie java.lang.

Wszystkie z nich dają „czysty” IllegalArgumentException (tj. Nie podklasę).

Te oznaczone *działają tylko, jeśli dodasz" throws Exception" (18 znaków) do maindeklaracji, ponieważ generują one sprawdzony wyjątek.

12 (30?) Znaków *

"".wait(-1);

Spowoduje to:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Znaków *

new Thread().join(-1);

22 znaki

Character.toChars(-1);

30 znaków

Character.UnicodeBlock.of(-1);
Klamka
źródło
Nie, nie skompiluje się, ponieważ może wyrzucić InterruptedException.
luckydonald
1
Kompilator unreported exception InterruptedException; must be caught or declared to be thrown
popełni
1
Ups, Ideone automatycznie dodaje throws Exceptiondo mainmetody. Dodałem notatkę w swoim poście.
Klamka
1
Mwhahaha! Udało mi się znaleźć moją IllegalArgumentExceptionpamięć. Nie potrzeba narzędzi takich jak grep. Tyle że zmienione reguły powodują, że jest nieważny. :-(
Justin
1
@usr No; prymitywy nie są obiektami w Javie.
Klamka
23

Oto miły, krótki sposób, aby to zrobić, w 17 13 znakach :

new Long("");

Rzuca NumberFormatException, co jest IllegalArgumentException. To i to zweryfikuj.

Równie dobrze można to zrobić

new Byte("");
Justin
źródło
Przepraszamy, wyjaśniłem, czego szukam: szukam „czystego” IllegalArgumentException. To powinno tak to nazwać.
luckydonald
@luckydonald co rozumiesz przez „nazywanie”? Typ podany w stacktrace? Jeśli tak, to czy wyjątek z przyczyną byłby dopuszczalny, gdyby IllegalArgumentException został przekazany wewnętrznie jako przyczyna do innego wyjątku?
Przywróć Monikę - ζ--
Celem jest zastąpienie normalnego rzutu nowym IAE (). Kod wykonywany metodą statyczną (główną) musi zawieść Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Gdyby zawiodło (linia, plik, stacktrace) nie ma znaczenia.
luckydonald
10

22 znaki:

Character.toChars(-1);

Uruchamianie przykład
Javadoc: java.lang.Character.toChars (int)

Kilka ładnie wyglądających wariantów:

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

~ijest taki sam jak -1 * (i+1)ponieważ odwraca bity. Otrzymamy więc niedozwolony parametr, ponieważ jest mniejszy niż 0.
1<<7stworzy zbyt wysoką liczbę, przesuwając 1 siedem razy. (to samo, co pomnożenie go 7 razy przez 2). Wydaje się 1114111, 1114112że ostatnia zaakceptowana wartość zawiedzie. Uwaga: może się to zmienić w zależności od środowiska i nie zawsze może być niezawodne.

Zobacz Oracle Docs „Operatory bitowe i bitowe z przesunięciem” i „Podstawowe typy danych”

28 znaków:

A jeśli nie lubisz używać klasy postaci w konkursie liczenia postaci *:

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

*) Żeby zrobić ten kalambur.

luckydonald
źródło
Nie musi być pozytywny; możesz zrobić dowolne nieujemne (tj. ~0też działa)
Justin
Pomyślałem o 0 jako dodatnim, ponieważ nie ma minus. Ale masz rację, a nawet Character.toChars(~-0); działa.
luckydonald
4
~ 0 to -1. Nie jestem pewien, co ~ -0 robi dla Ciebie, oprócz tego, że wymaga dodatkowego znaku.
alex.forencich,
Wygląda śmieszniej xD
luckydonald
8

21 znaków:

System.getProperty("");

Zgodnie z dokumentacją getPropertyi setPropertywyrzucić, IllegalArgumentExceptionjeśli klucz jest pusty.

Zbliża się do ciemności
źródło
5

25 znaków

Tworzy wektor o niepoprawnej (ujemnej) długości:

new java.util.Vector(-1);

Wyświetla:

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
źródło
1

Oto 24 znaki:

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

To rzuci an IllegalFormatException, który jest IllegalArgumentException.

AJMansfield
źródło
1

19 znaków:

String.format("%");

Rzuty java.util.UnknownFormatConversionException, które dziedziczy, z IllegalFormatExceptionkolei dziedziczy IllegalArgumentException;

cPu1
źródło
1

14 znaków

this.wait(-1);

17 znaków

Thread.sleep(-1);

Jeśli chodzi o kod, który bezpośrednio zgłasza IllegalArgumentException, zrobią to.

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

więc kod bezpośredni to 17 znaków, jeśli jesteś super-stickerem i liczysz znaki, aby dodać klauzulę throws dla przerwanego wyjątku, możesz go skrócić, po prostu rzucając surową klasę Exception

jpcoder
źródło
1
this.wait(-1)nie działa w głównej funkcji z powodu głównej istoty static.
luckydonald
Thread.sleep(-1)wymaga dodania deklaracji wyrzutów do funkcji, aby znów się wydłużyła. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald