2009-11-06 17 views
8

काम नहीं करता है (संकलन त्रुटि: वापसी कथन याद आ रही):एक वापसी कथन के साथ एक कोशिश पकड़ काम के अंदर क्यों 'फेंकता है' करता है

public SqlMapClientTemplate getSqlTempl() throws UivException, SQLException{ 
    try { 
     SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("MySqlMapClient"); 
     DataSource dsc = (DataSource) ServiceLocator.getInstance().getDataSource(PIH_EIV_ORCL); 
     return new SqlMapClientTemplate (dsc, scl); 
    } 
    catch (NamingException ne) 
    { 
     log.error(ne.getMessage(), ne); 
     throw new SQLException("Unable to get database connection: " + ne.getMessage()); 
    } 
} 

क्यों

public SqlMapClientTemplate getSqlTempl() throws UivException, SQLException{ 
    try { 
     SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("MySqlMapClient"); 
     DataSource dsc = (DataSource) ServiceLocator.getInstance().getDataSource(PIH_EIV_ORCL); 
     return new SqlMapClientTemplate (dsc, scl); 
    } 
    catch (NamingException ne) 
    { 
     log.error(ne.getMessage(), ne); 
    } 
} 

काम करता है?

+0

आपका क्या मतलब है "काम नहीं करता"? पहले मामले में क्या होता है? – noctonura

+3

मेरा मानना ​​है कि यह काफी स्पष्ट था। :) –

+0

चूंकि आप पहले मामले को काम करने की उम्मीद करते हैं, इसलिए मुझे यह पूछना है कि आप इस विधि से वास्तव में क्या उम्मीद करेंगे? –

उत्तर

13

पहले मामले में कैच ब्लॉक के बाद या कैच ब्लॉक के अंदर विधि कुछ भी वापस नहीं कर रही है।

दूसरे मामले में कैच ब्लॉक अपवाद फेंक रहा है इसलिए संकलक जानता है कि विधि किसी ऑब्जेक्ट को वापस कर देगी या अपवाद फेंक देगी।

public String foo() { 
    int x = 5; 
} 

दूसरे में समारोह की गारंटी है:

1

पहले मामले में यदि अपवाद फेंक दिया जाता है कोई वापसी मूल्य नहीं होता है, समारोह बस बंद अंत है, जो एक त्रुटि है, एक ही रूप में गिर जाता है पर एक मूल्य लौटें या एक अपवाद फेंक दें।

आप वास्तव में सिर्फ अपवाद लॉग इन करने की नहीं, बल्कि पहला उदाहरण आप की तरह कुछ लिख सकता है में किसी भी अन्य कार्रवाई लेने चाहते हैं:

public SqlMapClientTemplate getSqlTempl() throws UivException, SQLException{ 
    SqlMapClientTemplate ret = null; //set a default value in case of error 
    try { 
     SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("MySqlMapClient"); 
     DataSource dsc = (DataSource) ServiceLocator.getInstance().getDataSource(PIH_EIV_ORCL); 
     ret = new SqlMapClientTemplate (dsc, scl); 
    } 
    catch (NamingException ne) 
    { 
     log.error(ne.getMessage(), ne); 
    } 
    return ret; 
} 
1

भूषण उल्लेख किया है, संकलक इस उदाहरण में देख सकते हैं कि कुछ हमेशा होता है एक वापसी या अपवाद होगा। आपके पहले मामले में यदि आपको नामकरण अपवाद मिलता है तो आप एक संदिग्ध स्थिति में समाप्त होते हैं, तो किसी ऐसे कार्य से कुछ भी वापस नहीं आता है जो अनुबंधित रूप से वापसी कर लेता है।

+0

हालांकि, भूषण के समान ही यही कहा गया है, लेकिन मुझे आपके द्वारा समझाया गया तरीका पसंद आया। +1 –

संबंधित मुद्दे