विधि 1:
This post by Alexey Ragozin बताता है कि कैसे एक जेनरिक चाल का उपयोग करने के एक अघोषित जाँच अपवाद फेंकने के लिए। उस पोस्ट से:
public class AnyThrow {
public static void throwUnchecked(Throwable e) {
AnyThrow.<RuntimeException>throwAny(e);
}
@SuppressWarnings("unchecked")
private static <E extends Throwable> void throwAny(Throwable e) throws E {
throw (E)e;
}
}
चाल throwUnchecked
पर निर्भर करता है "झूठ बोल" संकलक है कि प्रकार E
throwAny
करने के लिए अपने कॉल के साथ RuntimeException
है। चूंकि throwAny
को throws E
के रूप में घोषित किया गया है, इसलिए संकलक सोचता है कि विशेष कॉल केवल RuntimeException
फेंक सकता है। बेशक, चाल throwAny
द्वारा मनमाने ढंग से E
घोषित कर दिया गया है और अंधेरे से इसे कास्टिंग कर दिया गया है, जिससे कॉलर को यह तय करने की इजाजत मिलती है कि इसका तर्क क्या है - भरोसेमंद डिज़ाइन करते समय भयानक डिज़ाइन। रनटाइम पर, E
erased है और इसका कोई मतलब नहीं है।
जैसा कि आपने देखा है, ऐसी चीज करना एक बड़ा हैक है और आपको इसका उपयोग बहुत अच्छी तरह से करना चाहिए।
विधि 2:
आप भी इस अंत करने के लिए sun.misc.Unsafe
उपयोग कर सकते हैं।
private static Unsafe getUnsafe() {
try {
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
return (Unsafe)theUnsafeField.get(null);
}
catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
यह बुला Unsafe.getUnsafe()
आम तौर पर एक SecurityException
फेंक के रूप में आवश्यक है: सबसे पहले आप एक विधि प्रतिबिंब का उपयोग करता है कि वर्ग के उदाहरण वापस जाने के लिए लागू करना चाहिए। एक बार जब आप Unsafe
का उदाहरण है कि आप अपने भयानक क्षमताओं का उपयोग करने के लिए रखा जा सकता है:
Unsafe unsafe = getUnsafe();
unsafe.throwException(new Exception());
क्रेडिट पद https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe पर this answer को जाता है।मैंने सोचा कि मैं पूर्णता के लिए इसका जिक्र करूँगा लेकिन शायद आपके कोड में Unsafe
की अनुमति देने के बजाय ऊपर की चाल का उपयोग करना बेहतर होगा।
विधि 3:
जुड़ा हुआ जवाब की टिप्पणी में Unsafe
, @bestsss points out एक बहुत सरल चाल का उपयोग कर पदावनत विधि Thread.stop(Throwable)
उपयोग के बारे में:
Thread.currentThread().stop(new Exception());
इस मामले में क्या तुम करोगी @SuppressWarnings("deprecation")
का उपयोग करें और एक बार फिर दस्तावेज़ बहुत भयंकर रूप से करें। दोबारा, मैं अपनी (सापेक्ष) सफाई के लिए पहली चाल पसंद करता हूं।
तुम कुछ ऐसा करना असंभव है परीक्षण कर रहे हैं। क्यूं कर? – rodrigoap
मैंने लॉजिकल हैंडलर का उपयोग करके साबुन प्रतिक्रिया का नकल करने की कोशिश की। हैंडल मैसेज (लॉजिकल मैसेज कॉन्टेक्स्ट संदर्भ) घोषणा नहीं करता है अपवाद फेंकता है। लेकिन साबुन अंत बिंदु से सभी अपवाद फेंकता अपवादों के उप-वर्ग हैं। मुझे अपनी सेवा प्रतिक्रिया को नकल करने के लिए उन अपवादों को फेंकने की ज़रूरत है। –
यदि आप रुचि रखते हैं तो मेरे संपादन को देखें। –