2013-12-20 52 views
2

這是非常簡單的問題,我經常用com.google.common.base.Preconditions在我的項目,以驗證參數和參數,例如:自定義異常與番石榴前提

Preconditions.checkNotNull(parameter, "message");
Preconditions.checkArgument(parameter > 0, "message");

這代碼可能會產生IllegalArgumentException或NPE。但很多時候我需要拋出自己的例外。 我該怎麼辦這個圖書館?或者,也許你可以建議另一個? 預先感謝您!

更新:我明白,我可以創建自己的簡單實用程序類,但我很想找到現成的解決方案。請讓我知道,如果有人知道這是可能的。

回答

2

是這樣的解決方案,我終於來到了。它確實是我想要的。可能是有用的人:

import java.lang.reflect.InvocationTargetException; 

// IMPORTANT: parameter exClass must have at least no args constructor and constructor with String param 
public class Precondition { 

public static <T extends Exception> void checkArgument(boolean expression, Class<T> exClass) throws T { 
    checkArgument(expression, exClass, null); 
} 

public static <T extends Exception> void checkArgument(boolean expression, Class<T> exClass, String errorMessage, Object... args) throws T { 
    if (!expression) { 
     generateException(exClass, errorMessage, args); 
    } 
} 

public static <T extends Exception> void checkNotNull(Object reference, Class<T> exClass) throws T { 
    checkNotNull(reference, exClass, null); 
} 

public static <T extends Exception> void checkNotNull(Object reference, Class<T> exClass, String errorMessage, Object... args) throws T { 
    if (reference == null) { 
     generateException(exClass, errorMessage, args); 
    } 
} 

private static <T extends Exception> void generateException(Class<T> exClass, String errorMessage, Object... args) throws T { 
    try { 
     if (errorMessage == null) { 
      throw exClass.newInstance(); 
     } else { 
      throw exClass.getDeclaredConstructor(String.class, Object[].class).newInstance(errorMessage, args); 
     } 
    } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

}

6

如果您想拋出自己的異常,只需使用類似Preconditions中的方法創建自己的類。這些方法中的每一個都非常簡單 - 添加某種「插件」功能以允許指定異常類與編寫自己的異常類相比真的會過度殺傷。

您始終可以使用source of Preconditions作爲起點。

1

Exception類型被硬編碼到Preconditions類中。你將需要實現你自己的異常和你自己的檢查功能。你總是可以在你自己的靜態類中完成它,類似於Preconditions的工作方式。

2

您可以使用valid4j與hamcrest-的匹配,而不是(Maven的中央發現的org.valid4j:valid4j)

輸入驗證拋出自定義異常:

import static org.valid4j.Validation.*; 

validate(argument, isValid(), otherwiseThrowing(InvalidException.class)); 

爲先決條件和後置條件(即斷言):

import static org.valid4j.Assertive.*; 

require(argument, notNullValue()); 
... 
ensure(result, isValid()); 

鏈接:

0

你總是可以做出這樣的事情對你自己(我不知道爲什麼從番石榴的傢伙沒有添加它尚未):

public static void check(final boolean expression, RuntimeException exceptionToThrow) { 
    if (!expression) { 
     throw checkNotNull(exceptionToThrow); 
    } 
} 

public static void check(final boolean expression, Supplier<? extends RuntimeException> exceptionToThrowSupplier) { 
    if (!expression) { 
     throw checkNotNull(exceptionToThrowSupplier).get(); 
    } 
}