รหัสที่สั้นที่สุดเพื่อโยน 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ไม่มีก็จะไม่รวบรวมเพราะมันสามารถโยน
luckydonald

1
คอมไพเลอร์จะผิดพลาด:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald

1
อ๊ะ Ideone เพิ่มโดยอัตโนมัติthrows Exceptionไปที่mainวิธีการ ฉันได้เพิ่มบันทึกย่อในโพสต์ของฉัน
Doorknob

1
Mwhahaha! ฉันจัดการเพื่อค้นหาIllegalArgumentExceptionตามหน่วยความจำของฉัน ไม่จำเป็นต้องใช้เครื่องมืออย่าง grep ยกเว้นกฎที่เปลี่ยนแปลงทำให้ไม่ถูกต้อง :-(
จัสติน

1
@usr ไม่; primitives ไม่ใช่วัตถุใน Java
ลูกบิดประตู

23

นี่เป็นวิธีสั้น ๆ ที่น่าทำใน17ตัวอักษร 13 ตัว :

new Long("");

มันพ่นซึ่งเป็นNumberFormatException สิ่งนี้และสิ่งนี้ยืนยันมันIllegalArgumentException

อย่างเท่าเทียมกันใคร ๆ ก็ทำได้

new Byte("");

ขออภัยชัดเจนสิ่งที่ฉันกำลังมองหา: ฉันกำลังมองหา 'สะอาด' IllegalArgumentException มันควรตั้งชื่ออย่างนั้น
luckydonald

@luckydonald คุณหมายถึงอะไรโดย "ตั้งชื่อ"? ชนิดที่ระบุใน stacktrace ถ้าเป็นเช่นนั้นจะมีข้อยกเว้นที่มีสาเหตุเป็นที่ยอมรับถ้า IllegalArgumentException ถูกส่งผ่านภายในเป็นสาเหตุของข้อยกเว้นอื่นหรือไม่
Reinstate Monica - ζ--

จุดประสงค์คือการแทนที่ IAE ใหม่ที่ใช้ในการโยนปกติ รหัสเมื่อดำเนินการในคงที่ (หลัก) Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4)วิธีการมีที่จะล้มเหลว มันจะล้มเหลว (line, file, stacktrace) ไม่สำคัญ
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 Docs "ผู้ดำเนินการ Bitwise และ Bit Shift"และ"ประเภทข้อมูลดั้งเดิม"ของOracle Docs

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");

นี้จะโยนซึ่งเป็นIllegalFormatExceptionIllegalArgumentException


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 ตัวอักษรถ้าคุณเป็นซุปเปอร์ stickler และการนับตัวอักษรเพื่อเพิ่มประโยคการโยนสำหรับข้อยกเว้นการขัดจังหวะคุณสามารถย่อให้สั้นลงได้โดยเพียงแค่โยนคลาส Exception


1
this.wait(-1)staticไม่ทำงานในหน้าที่หลักเนื่องจากเป็นหลัก
luckydonald

Thread.sleep(-1)ต้องการให้คุณเพิ่มการประกาศ throws ลงในฟังก์ชันดังนั้นจึงได้รับอีกต่อไป error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.