java जब कैच वास्तव में कुछ भी नहीं पकड़ता है




exception try-catch (4)

इस प्रश्न का पहले से ही यहाँ एक उत्तर है:

हाल ही में एक डेटाबेस में संग्रहीत खराब डेटा के कारण मेरा प्रोग्राम क्रैश हो गया था। इसने मुझे भ्रमित किया, क्योंकि मुझे लगा कि मुझे इसे रोकने के लिए एक पकड़ थी।

निम्नलिखित कोड का उद्देश्य कर्मचारी बैज संख्याओं की तुलना करना और उन्हें क्रमबद्ध करना है। यदि कोई त्रुटि है, तो -1 और सिपाही को वापस लौटाएं - रुकें नहीं क्योंकि कई हजार बैज संख्याओं में से एक गलत है:

public int compare(Employee t, Employee t1) {
    Integer returnValue = -1;
    try {
        Integer tb = Integer.parseInt(t.getBadgeNumber());
        Integer t1b = Integer.parseInt(t1.getBadgeNumber());
        returnValue = tb.compareTo(t1b);
    } catch (Exception e) {
        returnValue = -1;//useless statement, I know.
    }
    return returnValue;
}

जब बैज बैज नंबर हिट होता है (जैसा कि इस मामले में टी), मुझे एक "java.lang.IllegalArgumentException: तुलना विधि अपने सामान्य अनुबंध का उल्लंघन करती है!" कैच में -1 लौटाने के बजाय त्रुटि।

मैं यहाँ पकड़ के बारे में क्या नहीं समझता?

पूर्ण स्टैकट्रेस:

16-May-2018 14:28:53.496 SEVERE [http-nio-8084-exec-601] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [RequestServlet] in context with path [/AppearanceRequest] threw exception
 java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at org.bcso.com.appearancerequest.html.NotifierHTML.getHTML(NotifierHTML.java:363)
at org.bcso.com.appearancerequest.AppearanceRequestServlet.processRequest(AppearanceRequestServlet.java:96)
at org.bcso.com.appearancerequest.AppearanceRequestServlet.doGet(AppearanceRequestServlet.java:565)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

कॉलिंग कोड:

    List<Employee> employeeList = DatabaseUtil.getEmployees();
    Collections.sort(employeeList, new BadgeComparator());

अपवाद (जो कुछ भी था) कैच द्वारा पकड़ा गया था catch (Exception e) । आपने इस अपवाद को लॉग नहीं किया, इसलिए आप नहीं जानते कि यह क्या था। आपको इसे किसी तरह से लॉग इन करना चाहिए ताकि आप जान सकें कि वास्तव में क्या हुआ था।

समस्या तब होती है जब आप -1 लौटते हैं। यह असंगत क्रम की संभावना के लिए अनुमति देता है, जिसे जावा का वर्तमान छँटाई एल्गोरिथ्म कभी-कभी पकड़ लेता है। संक्षेप में, एक त्रुटि पर -1 लौटाने का मतलब है कि आप दावा कर रहे हैं कि दोनों a < b और b < a सत्य हैं, क्योंकि अपवाद दोनों मामलों में पकड़ा जाएगा। यह तार्किक रूप से गलत है। छँटाई एल्गोरिथ्म इस का पता लगाता है और IllegalArgumentException फेंकता है। ध्यान दें कि compare विधि आपके स्टैक ट्रेस में नहीं है; यह कलेक्शन.सॉर्ट को कॉल है।

अपवाद को लॉग करने के अलावा, इससे पहले कि आप अपने कार्यक्रम में तुलनात्मक कदम पर पहुंचें, उसे संभाल लें। यदि आपको स्ट्रिंग को पूर्णांक के रूप में पार्स करना है, तो Employee ऑब्जेक्ट बनाते समय ऐसा करें, ताकि आपके प्रोग्राम में सॉर्टिंग चरण पर पहुंचने से पहले ही सत्यापन हो जाए। एक Comparator को डेटा को मान्य नहीं करना चाहिए; यह केवल डेटा की तुलना करना चाहिए।


हालांकि यह मामला नहीं है, याद रखें कि आप Throwable उदाहरणों को फेंक और पकड़ सकते हैं, और अपवादों के अलावा Errors । उन्हें पकड़ना संभव है, हालांकि जब वे इसकी संभावना नहीं रखते हैं कि आगे कोई काम किया जा सकता है।

इसलिए आपकी कोशिश ने एक्सेप्शन के अलावा किसी एरर या किसी थ्रोएबल को नहीं पकड़ा होगा।

public static void main(String[] args) {

    try {
        throw new Error("test exception try-catch");
    } catch (Throwable e) {
        System.out.println("Error caught in throwable catch");
    }

    try {
        throw new Error("test exception try-catch");
    } catch (Exception e) {
        System.out.println("Error caught in exception catch");
    }
}

जिसके परिणामस्वरूप होगा:

Error caught in throwable catch
Exception in thread "main" java.lang.Error: test exception try-catch
    at ...

जैसा कि आपने स्पष्ट रूप से TimSort.mergeHi() रूप से आमंत्रित किया है। TimSort.mergeHi() आंतरिक रूप से आह्वान किया गया है।

java.util.TimSort.mergeHi (TimSort.java:868) पर

आप कैच स्टेटमेंट को sort() चारों ओर ले जा सकते हैं, लेकिन परिणामस्वरूप सॉर्ट नहीं किया जाएगा या पूर्ण नहीं होगा। इसलिए यह एक अच्छा विचार नहीं है।
लंबी कहानी छोटी: compareTo() अनुबंध का उल्लंघन न करें और आपको किसी भी अपवाद को पकड़ने की आवश्यकता नहीं होगी जो अब नहीं होगा।


आपके द्वारा यहां चिपकाए गए विधि की तुलना में वह अपवाद नहीं है। स्टैकट्रेस की जाँच करें। इसमें कोई compare कॉल नहीं है।





catch-block