Java'da IllegalArgumentException öğesini atmak için en kısa kod


21

Tamam, hepimiz Java'da bir IllegalArgumentException oluşturmanın normal yolunu biliyoruz:

throw new IllegalArgumentException(); // 37 characters

Ancak bunu yapmanın daha kısa (daha az karakterde olduğu gibi) yolları olmalıdır. Daha az kodla nasıl java.lang.IllegalArgumentException oluşturabiliriz?

  • Kod parçası derlemek ve java 7 çalıştırmak zorundadır.
  • İthalat / harici paket yok (örn. Kullanılmıyor java.util.Arrays.toString())
    • tek istisna: java.lang çünkü otomatik olarak içe aktarılır.
  • Kendi yöntemlerinizi / sınıflarınızı ekleyebilirsiniz.
  • Bir java.lang.IllegalArgumentException özel durumu oluşturmalıdır
    • Düzenleme: hata çıktısı (stacktrace) bunu java.lang.IllegalArgumentException olarak adlandırmalıdır, bu nedenle alt sınıfları yoktur.

Başlamak için bir temel oluşturmak için:

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

Yanıtlar:


29

Bunların hepsi greppaketteki kaynak koduna ping yaparak bulundu java.lang.

Hepsi bir "saf" ile sonuçlanır IllegalArgumentException(yani bunun bir alt sınıfı değildir).

İşaretli olanlar, *yalnızca bir tür kontrol edilmiş istisna attığından bildiriminize " throws Exception"(18 karakter) eklerseniz çalışır main.

12 (30?) Karakter *

"".wait(-1);

Bunun sonucu:

java.lang.IllegalArgumentException: timeout value is negative

22 (40?) Karakter *

new Thread().join(-1);

22 karakter

Character.toChars(-1);

30 karakter

Character.UnicodeBlock.of(-1);

Hayır, derleyemez çünkü a atabilir InterruptedException.
luckydonald

1
Derleyici hata verecektir:unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald

1
Hay aksi, Ideone otomatik ekler throws Exceptioniçin mainyöntemle. Yayına bir not ekledim.
Kapı tokmağı

1
Mwhahaha! IllegalArgumentExceptionHafızamı bulmayı başardım . Grep gibi aletlere gerek yok. Değiştirilen kurallar dışında geçersiz kılar. :-(
Justin

1
@usr Hayır; temel öğeler Java'daki nesneler değildir.
Kapı Tokmağı

23

İşte bunu yapmak için güzel bir kısa yol, 17 13 karakter :

new Long("");

Bir atar NumberFormatException, ki bu bir IllegalArgumentException. Bu ve bu doğrular.

Eşdeğer olarak,

new Byte("");

Üzgünüm, aradığım şeyi temizledim: 'Temiz' bir IllegalArgumentException arıyorum. Buna böyle bir isim vermeli.
luckydonald

@luckydonald "adlandırma" ile ne demek istiyorsun? Yığın izinde verilen tür? Öyleyse, IllegalArgumentException başka bir özel duruma neden olarak dahili olarak iletildiyse, nedenli bir istisna kabul edilebilir mi?
Monica'yı eski durumuna getir - ζ--

Amaç normal atış yeni IAE () yerine etmektir. Statik (ana) bir yöntemde yürütüldüğünde kodun başarısız olması gerekir Exception in thread "main" java.lang.IllegalArgumentException at Untitled.main(Titled.java:4). Başarısız olduysa (satır, dosya, yığın izlemesi) önemli değil.
luckydonald

10

22 karakter:

Character.toChars(-1);

Çalışan örnek
Javadoc: java.lang.Character.toChars (int)

Bazı hoş görünümlü varyantlar:

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

~iaynıdır -1 * (i+1)bu bit ters çevrilir için. Bu nedenle, geçersiz bir parametre elde edeceğiz, çünkü 0'dan küçükse
1<<7, 1'i yedi kez kaydırarak çok yüksek bir sayı oluşturacaktır. (7 ile 2 çarpma ile aynı). Son kabul edilen değer gibi görünüyor 1114111, 1114112başarısız olur. Not: Bu, ortamınıza bağlı olarak değişebilir ve her zaman güvenilir olmayabilir.

Bkz Oracle Dokümanlar "bitsel ve Bit Shift Operatörler" ve "İlkel Veri Türleri"

28 karakter:

Ve karakter sınıfını bir karakter sayısı yarışmasında kullanmayı sevmiyorsanız *:

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

*) Sadece bu oyunu yapmak için.


Olumlu olması gerekmez; negatif olmayan herhangi bir şey yapabilirsiniz (yani ~0çalışır)
Justin

0'ı pozitif olarak düşündüm çünkü eksi yok. Ama senin hakkın ve hatta Character.toChars(~-0); çalışıyor.
luckydonald

4
% 0, -1'dir. Ek bir karaktere ek olarak ~ -0'ın sizin için ne yaptığından emin değilim.
alex.forencich


8

21 karakter:

System.getProperty("");

Belgelere göre getPropertyve anahtar boşsa setPropertyatın IllegalArgumentException.


5

25 Karakter

Geçersiz (negatif) uzunlukta bir vektör oluşturur:

new java.util.Vector(-1);

ekranlar:

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

İşte 24 karakter:

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

Bu bir atar IllegalFormatException, ki bu bir IllegalArgumentException.


1

19 karakter:

String.format("%");

Bundan java.util.UnknownFormatConversionExceptionmiras kalan miras kalan IllegalFormatExceptionatar IllegalArgumentException;


1

14 karakter

this.wait(-1);

17 Karakter

Thread.sleep(-1);

Doğrudan IllegalArgumentException kuralını atan kod kadar, bunlar bunu yapacaktır.

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

yani doğrudan kod 17 karakterdir, eğer süper bir stickler iseniz ve kesilen istisna için bir atış cümlesi eklemek için karakterleri sayıyorsanız, sadece ham Exception sınıfını atarak kısaltabilirsiniz.


1
this.wait(-1)ana varlık nedeniyle ana işlevde çalışmaz static.
luckydonald

Thread.sleep(-1)işleve bir atar bildirimi eklemenizi gerektirir, bu nedenle tekrar uzar. error: unreported exception InterruptedException; must be caught or declared to be thrown
luckydonald
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.