Java中引发IllegalArgumentException的最短代码


21

Okey,我们都知道在Java中引发IllegalArgumentException的正常方法:

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();
    }
}

Answers:


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 2014年

1
编译器将错误:unreported exception InterruptedException; must be caught or declared to be thrown
— luckydonald 2014年

1
糟糕,Ideone自动添加throws Exception到该main方法中。我在帖子中添加了笔记。
— 门把手

1
哇哈哈哈!我设法IllegalArgumentException通过记忆找到我。无需使用grep之类的工具。除非更改了规则,否则使其无效。:-(
— 贾斯汀

1
@usr否;原语不是Java中的对象。
— 门把手

23

这是一个不错的简短方法,只需17 13个字符:

new Long("");

它抛出一个NumberFormatException,这是一个IllegalArgumentException。这并对此进行验证。

同样,一个人可以做

new Byte("");

抱歉,明确了我要查找的内容:我正在寻找“干净”的IllegalArgumentException。它应该这样命名。
— luckydonald 2014年

@luckydonald“命名”是什么意思?在堆栈跟踪中给定的类型?如果是这样,如果将IllegalArgumentException作为另一个异常的原因在内部传递,那么“有原因的异常”是否可以接受?
— 恢复莫妮卡-ζ-2014年

目的是替换正常抛出的新IAE()。以静态(主要)方法执行时,代码必须失败Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4)。是否失败(行,文件,堆栈跟踪)无关紧要。
— luckydonald 2014年

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乘以7相同)。最后接受的值似乎是1114111,1114112将失败。注意:这可能会根据您的环境而改变,并且可能并不总是可靠的。

请参见Oracle Docs“按位和移位操作”和“原始数据类型”

28个字符:

如果您不喜欢在字符计数比赛中使用字符类*:

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

*)只是为了使这个双关语。


不需要肯定。您可以做任何非负的操作(例如~0也可以)
— 贾斯汀2014年

我认为0为正数,因为它没有负数。但是你的权利,甚至Character.toChars(~-0); 行之有效。
— luckydonald 2014年

4
〜0为-1。除了需要额外的字符外,不确定〜-0为您做什么。
— alex.forencich 2014年

看起来更有趣xD
— luckydonald 2014年

8

21个字符:

System.getProperty("");

根据文档,如果键为空getProperty,则setProperty抛出IllegalArgumentException。


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个字符,如果您是超级棒棒糖并计算字符以为中断的异常添加throws子句,则可以通过抛出原始Exception类来缩短它


1
this.wait(-1)由于main存在而无法在main函数中使用static。
— luckydonald

Thread.sleep(-1)要求您在函数中添加throws声明,因此它又变长了。error: unreported exception InterruptedException; must be caught or declared to be thrown
— luckydonald
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.