Kode terpendek untuk membuang IllegalArgumentException di Jawa

21

Oke, kita semua tahu cara normal untuk melempar IllegalArgumentException di Jawa:

throw new IllegalArgumentException(); // 37 characters

Tetapi harus ada cara yang lebih pendek (seperti dalam karakter kurang) untuk melakukannya. Bagaimana kita bisa menghasilkan java.lang.IllegalArgumentException dengan kode yang lebih sedikit?

  • Fragmen kode harus dikompilasi dan dijalankan di java 7.
  • Tidak ada paket impor / eksternal (mis. Tidak menggunakan java.util.Arrays.toString())
    • satu-satunya pengecualian: java.lang karena secara otomatis diimpor.
  • Anda dapat menambahkan metode / kelas sendiri.
  • Itu harus membuang java.lang.IllegalArgumentException
    • Sunting: output kesalahan (stacktrace) harus menamainya java.lang.IllegalArgumentException, jadi tidak ada subkelasnya.

Untuk memulai dari:

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

Jawaban:

29

Ini semua ditemukan dengan melakukan grepping kode sumber dalam paket java.lang.

Semuanya menghasilkan "murni" IllegalArgumentException(yaitu bukan subkelasnya).

Yang ditandai *hanya berfungsi jika Anda menambahkan " throws Exception"(18 karakter) ke maindeklarasi Anda , karena mereka melemparkan pengecualian jenis tertentu.

12 (30?) Karakter *

"".wait(-1);

Ini akan menghasilkan:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Karakter *

new Thread().join(-1);

22 karakter

Character.toChars(-1);

30 karakter

Character.UnicodeBlock.of(-1);
Gagang pintu
sumber
Tidak, itu tidak akan dikompilasi karena bisa melempar a InterruptedException.
luckydonald
1
Kompiler akan membuat kesalahan:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
1
Ups, Ideone secara otomatis menambahkan throws Exceptionke mainmetode. Saya telah menambahkan catatan di posting saya.
Gagang Pintu
1
Mwhahaha! Saya berhasil menemukan IllegalArgumentExceptiondengan ingatan saya . Tidak perlu alat seperti grep. Kecuali aturan yang diubah membuatnya tidak valid. :-(
Justin
1
@ usr Tidak; primitif bukan objek di Jawa.
Gagang Pintu
23

Inilah cara singkat yang baik untuk melakukannya, dalam 17 13 karakter :

new Long("");

Itu melempar NumberFormatException, yang merupakan IllegalArgumentException. Ini dan ini memverifikasinya.

Setara, orang bisa melakukannya

new Byte("");
Justin
sumber
Maaf, menjelaskan apa yang saya cari: Saya mencari IllegalArgumentException 'bersih'. Seharusnya namanya begitu.
luckydonald
@luckydonald apa yang Anda maksud dengan "penamaan"? Jenis yang diberikan di stacktrace? Jika demikian, apakah pengecualian dengan sebab dapat diterima jika IllegalArgumentException disahkan secara internal sebagai penyebab pengecualian lain?
Reinstate Monica - ζ--
Tujuannya adalah untuk mengganti lemparan normal IAE baru (). Kode, ketika dieksekusi dalam metode statis (utama) harus gagal Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Jika gagal (baris, file, stacktrace) tidak masalah.
luckydonald
10

22 karakter:

Character.toChars(-1);

Contoh menjalankan
Javadoc: java.lang.Character.toChars (int)

Beberapa varian yang terlihat menarik:

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

~isama seperti -1 * (i+1)karena membalikkan bit. Jadi kita akan mendapatkan parameter ilegal, karena lebih kecil dari 0.
1<<7akan membuat angka terlalu tinggi dengan menggeser 1 tujuh kali. (sama dengan kalikan 7 kali dengan 2). Nilai yang diterima terakhir tampaknya 1114111, 1114112akan gagal. Catatan: ini mungkin berubah tergantung pada lingkungan Anda, dan mungkin tidak selalu dapat diandalkan.

Lihat Oracle Docs "Operator Bitwise dan Bit Shift" dan "Tipe Data Primitif"

28 karakter:

Dan jika Anda tidak suka menggunakan kelas karakter dalam kompetisi jumlah karakter *:

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

*) Hanya untuk membuat permainan kata-kata ini.

luckydonald
sumber
Tidak perlu positif; Anda dapat melakukan non-negatif (yaitu ~0berfungsi juga)
Justin
Saya menganggap 0 sebagai positif karena tidak ada minusnya. Tetapi hak Anda, dan bahkan Character.toChars(~-0); berhasil.
luckydonald
4
~ 0 adalah -1. Tidak yakin apa yang ~ -0 lakukan untuk Anda, selain membutuhkan karakter tambahan.
alex.forencich
Itu terlihat lebih lucu xD
luckydonald
8

21 karakter:

System.getProperty("");

Sesuai dokumentasi, getPropertydan setPropertymembuang IllegalArgumentExceptionjika kunci kosong.

ApproachingDarknessFish
sumber
5

25 Karakter

Membuat vektor dengan panjang tidak valid (negatif):

new java.util.Vector(-1);

Menampilkan:

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
sumber
1

Berikut 24 karakter:

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

Ini akan melempar IllegalFormatException, yang merupakan IllegalArgumentException.

AJMansfield
sumber
1

19 karakter:

String.format("%");

Melempar java.util.UnknownFormatConversionException, yang mewarisi dari IllegalFormatException, yang, pada gilirannya, mewarisi dari IllegalArgumentException;

cPu1
sumber
1

14 Karakter

this.wait(-1);

17 Karakter

Thread.sleep(-1);

Sejauh kode yang secara langsung melempar IllegalArgumentException, ini akan melakukannya.

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

jadi kode langsungnya adalah 17 karakter, jika Anda menjadi super stickler dan menghitung karakter untuk menambahkan klausa pelemparan untuk pengecualian terputus, Anda dapat mempersingkatnya dengan hanya melempar kelas Exception mentah

jpcoder
sumber
1
this.wait(-1)tidak berfungsi dalam fungsi utama, karena makhluk utama static.
luckydonald
Thread.sleep(-1)mengharuskan Anda untuk menambahkan deklarasi lemparan ke fungsi, jadi itu akan menjadi lebih lama lagi. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald