Take the 2-minute tour ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Okey, we all know the normal way to throw a IllegalArgumentException in Java:

throw new IllegalArgumentException(); // 37 characters

But there must be a shorter (as in less characters) ways to do so. How can we produce a java.lang.IllegalArgumentException with even less code?

  • The code fragment has to compile and run in java 7.
  • No imports/external packages (e.g. not using java.util.Arrays.toString() )
    • only exception: java.lang because it is automatically imported.
  • You can add own methods/classes.
  • It must throw a java.lang.IllegalArgumentException
    • Edit: the error output (stacktrace) must name it java.lang.IllegalArgumentException, so no subclasses of it.

To have a base to start from:

class Titled {
    public static void main(String[] args) {
        throw new IllegalArgumentException();
    }
}
share|improve this question

5 Answers 5

These were all found by grepping the source code in the package java.lang.

All of them result in a "pure" IllegalArgumentException (i.e. not a subclass of it).

The ones marked * only work if you add " throws Exception" (18 characters) to your main declaration, as they throw a checked exception of some kind.

12 (30?) characters*

"".wait(-1);

This will result in:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) characters*

new Thread().join(-1);

22 characters

Character.toChars(-1);

30 characters

Character.UnicodeBlock.of(-1);
share|improve this answer
    
No, it will not compile because it can throw a InterruptedException. –  luckydonald yesterday
    
The compiler will error: unreported exception InterruptedException; must be caught or declared to be thrown –  luckydonald yesterday
    
@luckydonald Hm, it does? I tested it on Ideone and it seemed to work. –  Doorknob yesterday
    
Whoops, Ideone automatically adds throws Exception to the main method. I've added a note in my post. –  Doorknob yesterday
    
Ideone tends to automatically add throws java.lang.Exception which will allow the InterruptedException to pass the compiler. (Also Ideone imports java.util.* and java.io.*) –  luckydonald yesterday

Here's a nice short way to do it, in 17 13 chars:

new Long("");

It throws a NumberFormatException, which is an IllegalArgumentException. This and this verify it.

Equivalently, one could do

new Byte("");
share|improve this answer
    
Sorry, clearified what I am looking for: I am looking a for 'clean' IllegalArgumentException. It should name it so. –  luckydonald yesterday
    
@luckydonald what do you mean by "naming"? The type given in the stacktrace? If so, would an exception-with-cause be acceptable if the IllegalArgumentException was passed internally as the cause to another exception? –  hexafraction 12 hours ago
    
The purpose is to replace the normal throw new IAE(). The code, when executed in a static (main) method has to fail Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Were it fails (line, file, stacktrace) doesn't matter. –  luckydonald 11 hours ago

22 characters:

Character.toChars(-1);

Running example
Javadoc: java.lang.Character.toChars(int)

Some nice looking variants:

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

~i is the same as -1 * (i+1) because it inverts the bits. So we will get a illegal parameter, because it is smaller then 0.
1<<7 will create a too high number by shifting the 1 seven times. (same as multiply it 7 times with 2). The last accepted Value seems to be 1114111, 1114112 will fail. Note: this might change depending on your environment, and could be not always reliable.

See the Oracle Docs "Bitwise and Bit Shift Operators" and "Primitive Data Types"

28 characters:

And if you don't like using the character class in a character count competition*:

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

*) Just to make this pun.

share|improve this answer
    
Doesn't need to be any positive; you can do any non-negative (ie ~0 works too) –  Quincunx 9 hours ago
    
I thought about 0 as a positive because it has no minus. But your right, and even Character.toChars(~-0); works. –  luckydonald 7 hours ago
1  
~0 is -1. Not sure what ~-0 does for you, besides requiring an additional character. –  alex.forencich 4 hours ago
    
It looks funnier xD –  luckydonald 2 hours ago

25 Characters

Creates a vector with an invalid (negative) length:

new java.util.Vector(-1);

Displays:

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)
share|improve this answer

Here's 24 characters:

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

This will throw an IllegalFormatException, which is an IllegalArgumentException.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.