Mã ngắn nhất để ném IllegalArgumentException trong Java


21

Okey, tất cả chúng ta đều biết cách thông thường để ném IllegalArgumentException trong Java:

throw new IllegalArgumentException(); // 37 characters

Nhưng phải có một cách ngắn hơn (như trong ít ký tự hơn) để làm như vậy. Làm thế nào chúng ta có thể tạo một java.lang.IllegalArgumentException với ít mã hơn?

  • Đoạn mã phải biên dịch và chạy trong java 7.
  • Không có nhập khẩu / gói bên ngoài (ví dụ không sử dụng java.util.Arrays.toString())
    • ngoại lệ duy nhất: java.lang vì nó được nhập tự động.
  • Bạn có thể thêm các phương thức / lớp riêng.
  • Nó phải ném java.lang.IllegalArgumentException
    • Chỉnh sửa: đầu ra lỗi (stacktrace) phải đặt tên là java.lang.IllegalArgumentException, vì vậy không có lớp con nào của nó.

Để có một cơ sở để bắt đầu từ:

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

Câu trả lời:


29

Tất cả đều được tìm thấy bằng cách grepping mã nguồn trong gói java.lang.

Tất cả chúng đều dẫn đến một "thuần" IllegalArgumentException(nghĩa là không phải là một lớp con của nó).

Những cái được đánh dấu *chỉ hoạt động nếu bạn thêm " throws Exception"(18 ký tự) vào mainkhai báo của bạn , vì chúng ném một ngoại lệ được kiểm tra của một số loại.

12 (30?) Ký tự *

"".wait(-1);

Điều này sẽ dẫn đến:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Ký tự *

new Thread().join(-1);

22 ký tự

Character.toChars(-1);

30 ký tự

Character.UnicodeBlock.of(-1);

Không, nó sẽ không biên dịch vì nó có thể ném a InterruptedException.
luckydonald

1
Trình biên dịch sẽ báo lỗi:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald

1
Rất tiếc, Ideone tự động thêm throws Exceptionvào mainphương thức. Tôi đã thêm một ghi chú trong bài viết của mình.
Doorknob

1
Mwhahaha! Tôi quản lý để tìm thấy tôi IllegalArgumentExceptionbằng trí nhớ. Không cần các công cụ như grep. Ngoại trừ các quy tắc thay đổi làm cho nó không hợp lệ. :-(
Justin

1
@usr Không; nguyên thủy không phải là đối tượng trong Java.
Doorknob

23

Đây là một cách ngắn gọn để làm điều đó, trong 17 13 ký tự :

new Long("");

Nó ném một NumberFormatException, đó là một IllegalArgumentException. Điều nàyđiều này xác minh nó.

Tương đương, người ta có thể làm

new Byte("");

Xin lỗi, đã làm rõ những gì tôi đang tìm kiếm: Tôi đang tìm kiếm một IllegalArgumentException 'sạch'. Nó nên đặt tên như vậy.
luckydonald

@luckydonald bạn có ý gì khi "đặt tên"? Các loại được đưa ra trong stacktrace? Nếu vậy, một ngoại lệ có nguyên nhân có thể được chấp nhận nếu IllegalArgumentException được thông qua nội bộ như là nguyên nhân cho một ngoại lệ khác không?
Phục hồi Monica - -

Mục đích là để thay thế IAE () mới ném bình thường. Mã, khi được thực thi trong một phương thức tĩnh (chính) phải thất bại Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Nếu nó không thành công (dòng, tệp, stacktrace) không thành vấn đề.
luckydonald

10

22 ký tự:

Character.toChars(-1);

Chạy ví dụ
Javadoc: java.lang.Character.toChars (int)

Một số biến thể đẹp mắt:

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

~ilà giống như -1 * (i+1)vì nó đảo ngược các bit. Vì vậy, chúng ta sẽ nhận được một tham số bất hợp pháp, bởi vì nó nhỏ hơn 0.
1<<7sẽ tạo ra một số quá cao bằng cách thay đổi 1 bảy lần. (giống như nhân nó 7 lần với 2). Giá trị được chấp nhận cuối cùng dường như 1114111, 1114112sẽ thất bại. Lưu ý: điều này có thể thay đổi tùy thuộc vào môi trường của bạn và không phải lúc nào cũng đáng tin cậy.

Xem Tài liệu Oracle "Các toán tử thay đổi bit và bit""Các kiểu dữ liệu nguyên thủy"

28 ký tự:

Và nếu bạn không thích sử dụng lớp nhân vật trong cuộc thi đếm nhân vật *:

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

*) Chỉ để thực hiện chơi chữ này.


Không cần phải tích cực; bạn có thể làm bất kỳ điều gì không tiêu cực (tức là ~0cũng hoạt động)
Justin

Tôi nghĩ về 0 là tích cực vì nó không có điểm trừ. Nhưng quyền của bạn, và thậm chí Character.toChars(~-0); hoạt động.
luckydonald

4
~ 0 là -1. Không chắc chắn những gì ~ -0 làm cho bạn, ngoài việc yêu cầu một nhân vật bổ sung.
alex.forencich

Trông thật hài hước xD
luckydonald

8

21 ký tự:

System.getProperty("");

Theo tài liệu, getPropertysetPropertyném IllegalArgumentExceptionnếu chìa khóa trống.


5

25 nhân vật

Tạo một vectơ có độ dài (âm) không hợp lệ:

new java.util.Vector(-1);

Hiển thị:

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

Dưới đây là 24 ký tự:

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

Điều này sẽ ném một IllegalFormatException, đó là một IllegalArgumentException.


1

19 ký tự:

String.format("%");

Ném java.util.UnknownFormatConversionException, kế thừa từ IllegalFormatException, mà, lần lượt, thừa hưởng từ IllegalArgumentException;


1

14 nhân vật

this.wait(-1);

17 nhân vật

Thread.sleep(-1);

Theo như mã trực tiếp ném IllegalArgumentException, những thứ này sẽ làm điều đó.

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

vì vậy mã trực tiếp là 17 ký tự, nếu bạn là một siêu ký tự và đếm các ký tự để thêm mệnh đề ném cho ngoại lệ được xen kẽ, bạn có thể rút ngắn nó bằng cách chỉ cần ném lớp Exception thô


1
this.wait(-1)không hoạt động trong chức năng chính, do bản thể chính static.
luckydonald 14/07/2015

Thread.sleep(-1)yêu cầu bạn thêm một khai báo ném vào hàm, để nó dài hơn một lần nữa. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald 14/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.