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

请参见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从中继承的掷,从中继承的 IllegalFormatExceptionIllegalArgumentException;


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.