क्या कोई ऐसी स्थिति है जहाँ अंत में जावा में नहीं चल सकता है? धन्यवाद।
क्या कोई ऐसी स्थिति है जहाँ अंत में जावा में नहीं चल सकता है? धन्यवाद।
जवाबों:
नोट: यदि JVM कोशिश या कैच कोड निष्पादित करते समय बाहर निकलता है, तो अंत में ब्लॉक निष्पादित नहीं हो सकता है। इसी तरह, यदि कोशिश या कैच कोड को निष्पादित करने वाला थ्रेड बाधित होता है या मारा जाता है, तो अंत में भले ही एप्लिकेशन पूरे जारी रहे, लेकिन निष्पादित नहीं हो सकता है।
मैं किसी भी अन्य तरीके से नहीं जानता कि आखिरकार ब्लॉक निष्पादित नहीं होगा ...
System.exit वर्चुअल मशीन को बंद कर देता है।
वर्तमान में चल रहे जावा वर्चुअल मशीन को समाप्त करता है। तर्क एक स्थिति कोड के रूप में कार्य करता है; कन्वेंशन द्वारा, एक नॉनज़रो स्टेटस कोड असामान्य समाप्ति को इंगित करता है।
यह विधि
exit
विधि को कक्षा में बुलाती हैRuntime
। यह विधि सामान्य रूप से कभी नहीं लौटती है।
try {
System.out.println("hello");
System.exit(0);
}
finally {
System.out.println("bye");
} // try-finally
"अलविदा" उपरोक्त कोड में प्रिंट नहीं करता है।
बस दूसरों ने जो कुछ भी कहा है, उस पर विस्तार करने के लिए, जेवीएम से बाहर निकलने जैसा कुछ भी नहीं होता है जो अंततः ब्लॉक को उकसाएगा। तो निम्न विधि:
public static int Stupid() {
try {
return 0;
}
finally {
return 1;
}
}
दोनों संकलित करेंगे और 1 वापस करेंगे।
System.exit से संबंधित, कुछ प्रकार की भयावह विफलताएं भी हैं, जहां अंततः ब्लॉक निष्पादित नहीं हो सकता है। यदि JVM पूरी तरह से मेमोरी से बाहर निकलता है, तो यह बिना कैच के आउट हो सकता है या अंत में हो सकता है।
विशेष रूप से, मुझे एक परियोजना याद है, जहां हमने मूर्खता से उपयोग करने की कोशिश की थी
catch (OutOfMemoryError oome) {
// do stuff
}
यह काम नहीं किया क्योंकि जेवीएम में कैच ब्लॉक को निष्पादित करने के लिए कोई मेमोरी नहीं थी।
try { for (;;); } finally { System.err.println("?"); }
उस स्थिति में अंत में निष्पादित नहीं होगा (जब तक कि पदावनत Thread.stop
को बुलाया नहीं जाता है, या एक उपकरण इंटरफ़ेस के माध्यम से एक समकक्ष, कहते हैं)।
throw
, तो finally
ब्लॉक अपेक्षित रूप से निष्पादित करेगा। try { throw new ThreadDeath(); } finally { System.err.println("?"); }
इस सूत्र में सूर्य ट्यूटोरियल को गलत तरीके से यहां उद्धृत किया गया है।
नोट: यदि JVM कोशिश या कैच कोड निष्पादित करते समय बाहर निकलता है, तो अंत में ब्लॉक निष्पादित नहीं करेगा । इसी तरह, यदि कोशिश या कैच कोड को निष्पादित करने वाला थ्रेड बाधित होता है या मारा जाता है, तो अंत में ब्लॉक हो जाएगा निष्पादित नहीं , भले ही एप्लिकेशन पूरी तरह से जारी रहे।
यदि आप अंत में ब्लॉक के लिए सूर्य ट्यूटोरियल को बारीकी से देखते हैं, तो यह नहीं कहता है "निष्पादित नहीं करेगा" लेकिन "निष्पादित नहीं कर सकता" यहां सही वर्णन है
नोट: यदि JVM कोशिश या कैच कोड निष्पादित करते समय बाहर निकलता है, तो अंत में ब्लॉक निष्पादित नहीं हो सकता है । इसी तरह, यदि कोशिश या कैच कोड को निष्पादित करने वाला थ्रेड बाधित होता है या मारा जाता है, तो अंत में भले ही एप्लिकेशन पूरे जारी रहे, लेकिन निष्पादित नहीं हो सकता है ।
इस व्यवहार का स्पष्ट कारण है, system.exit पर कॉल करना () रनटाइम सिस्टम थ्रेड में संसाधित होता है जो jvm को बंद करने में समय लग सकता है, इस बीच थ्रेड अनुसूचक अंत में निष्पादित करने के लिए कह सकता है। तो अंत में हमेशा निष्पादित करने के लिए डिज़ाइन किया गया है, लेकिन अगर आप jvm को बंद कर रहे हैं, तो ऐसा हो सकता है कि jvm पहले बंद हो जाए।
इसके अलावा अगर कोई गतिरोध / लाइवलॉक अंदर होता है try
ब्लॉक के ।
यहाँ वह कोड है जो इसे प्रदर्शित करता है:
public class DeadLocker {
private static class SampleRunnable implements Runnable {
private String threadId;
private Object lock1;
private Object lock2;
public SampleRunnable(String threadId, Object lock1, Object lock2) {
super();
this.threadId = threadId;
this.lock1 = lock1;
this.lock2 = lock2;
}
@Override
public void run() {
try {
synchronized (lock1) {
System.out.println(threadId + " inside lock1");
Thread.sleep(1000);
synchronized (lock2) {
System.out.println(threadId + " inside lock2");
}
}
} catch (Exception e) {
} finally {
System.out.println("finally");
}
}
}
public static void main(String[] args) throws Exception {
Object ob1 = new Object();
Object ob2 = new Object();
Thread t1 = new Thread(new SampleRunnable("t1", ob1, ob2));
Thread t2 = new Thread(new SampleRunnable("t2", ob2, ob1));
t1.start();
t2.start();
}
}
यह कोड निम्नलिखित आउटपुट का उत्पादन करता है:
t1 inside lock1
t2 inside lock1
और "अंत में" कभी भी मुद्रित नहीं होता
यदि कोशिश या कैच कोड निष्पादित करते समय JVM बाहर निकलता है, तो अंत में ब्लॉक निष्पादित नहीं हो सकता है। ( स्रोत )
सामान्य शटडाउन - यह तब होता है जब अंतिम गैर-डेमन थ्रेड बाहर निकलता है या जब रंटाइम.एक्सिट () ( स्रोत )
जब कोई थ्रेड बाहर निकलता है, तो JVM रनिंग थ्रेड्स की एक इन्वेंट्री करता है, और यदि केवल थ्रेड्स जो बचे हुए हैं, डेमन थ्रेड्स हैं, यह एक क्रमिक शटडाउन आरंभ करता है। जब JVM रुकता है, तो किसी भी शेष डेमन थ्रेड्स को छोड़ दिया जाता है अंत में ब्लॉक निष्पादित नहीं किए जाते हैं, स्टैक जेवीएम को केवल बाहर नहीं निकालते हैं। डेमन थ्रेड्स का इस्तेमाल शायद ही कभी किया जाना चाहिए, कुछ प्रसंस्करण गतिविधियों को बिना किसी सफाई के किसी भी समय सुरक्षित रूप से छोड़ दिया जा सकता है। विशेष रूप से, उन कार्यों के लिए डेमन थ्रेड्स का उपयोग करना खतरनाक है जो किसी भी प्रकार का I / O प्रदर्शन कर सकते हैं। डेमॉन थ्रेड्स को "हाउसकीपिंग" कार्यों के लिए सबसे अच्छा सहेजा जाता है, जैसे कि बैकग्राउंड थ्रेड जो समय-समय पर एक इन-मेमोरी कैश से समाप्त प्रविष्टियों को हटा देता है। ( स्रोत )
अंतिम गैर-डेमॉन धागा उदाहरण से बाहर निकलता है:
public class TestDaemon {
private static Runnable runnable = new Runnable() {
@Override
public void run() {
try {
while (true) {
System.out.println("Is alive");
Thread.sleep(10);
// throw new RuntimeException();
}
} catch (Throwable t) {
t.printStackTrace();
} finally {
System.out.println("This will never be executed.");
}
}
};
public static void main(String[] args) throws InterruptedException {
Thread daemon = new Thread(runnable);
daemon.setDaemon(true);
daemon.start();
Thread.sleep(100);
// daemon.stop();
System.out.println("Last non-daemon thread exits.");
}
}
आउटपुट:
Is alive
Is alive
Is alive
Is alive
Is alive
Is alive
Is alive
Is alive
Is alive
Is alive
Last non-daemon thread exits.
Is alive
Is alive
Is alive
Is alive
Is alive
निम्नलिखित मामलों में, अंत में ब्लॉक निष्पादित नहीं किया जाएगा: -
System.exit(0)
से मंगवाया जाता है try
। try
ब्लॉक में गतिरोध की स्थितिअन्य फ्रिंज मामले भी हो सकते हैं, जहां अंत में ब्लॉक निष्पादित नहीं किया जाएगा।
अंत में कोड निष्पादन को रोकने के दो तरीके हैं:
1. System.exit () का उपयोग करें;
2. यदि किसी तरह निष्पादन नियंत्रण ब्लॉक की कोशिश करने के लिए नहीं पहुंचता है।
देख:
public class Main
{
public static void main (String[]args)
{
if(true){
System.out.println("will exceute");
}else{
try{
System.out.println("result = "+5/0);
}catch(ArithmeticException e){
System.out.println("will not exceute");
}finally{
System.out.println("will not exceute");
}
}
}
}
मैं आख़िरकार ब्लॉक के एक बहुत ही विशिष्ट मामले में आया हूँ जो विशेष रूप से प्ले फ्रेमवर्क से संबंधित नहीं है।
मुझे यह जानकर आश्चर्य हुआ कि इस कंट्रोलर एक्शन कोड में अंततः ब्लॉक केवल एक अपवाद के बाद मिला, लेकिन कभी भी नहीं जब कॉल वास्तव में सफल हुई।
try {
InputStream is = getInputStreamMethod();
renderBinary(is, "out.zip");
catch (Exception e) {
e.printStackTrace();
} finally {
cleanUp();
}
शायद थ्रेड को समाप्त कर दिया जाता है या जब रेंडरबिनरी () कहा जाता है। मुझे संदेह होगा कि अन्य रेंडर () कॉल के लिए भी यही बात होती है, लेकिन मैंने इसे सत्यापित नहीं किया।
मैंने कोशिश की / पकड़ने के बाद रेंडरबिनरी () को स्थानांतरित करके समस्या को हल किया। आगे की जांच में पता चला कि प्ले एक @ एनाउंसमेंट एनोटेशन प्रदान करता है जिससे एक कंट्रोलर एक्शन निष्पादित होने के बाद निष्पादित होता है। यहाँ पर चेतावनी यह है कि नियंत्रक में किसी भी कार्रवाई के निष्पादन के बाद इसे कॉल किया जाएगा, इसलिए यह हमेशा एक अच्छा विकल्प नहीं हो सकता है।
//If ArithmeticException Occur Inner finally would not be executed
class Temp
{
public static void main(String[] s)
{
try
{
int x = 10/s.length;
System.out.println(x);
try
{
int z[] = new int[s.length];
z[10] = 1000;
}catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(e);
}
finally
{
System.out.println("Inner finally");
}
}
catch(ArithmeticException e)
{
System.out.println(e);
}
finally
{
System.out.println("Outer Finally");
}
System.out.println("Remaining Code");
}
}