2009-11-06 45 views
8

不起作用(編譯錯誤:缺少return語句)爲什麼一個嘗試catch裏面工作return語句 '拋出'

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); 
    } 
} 

作品:

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()); 
    } 
} 

爲什麼呢?

+0

你是什麼意思「不起作用」?第一種情況會發生什麼? – noctonura 2009-11-06 02:56:22

+3

我相信這很明顯。 :) – 2009-11-06 02:59:00

+0

既然您期望第一個案例能夠奏效,那麼我不得不問,您預期這個方法會返回什麼結果? – 2009-11-06 04:19:52

回答

13

在第一種情況下,該方法在catch塊之後或catch塊內不返回任何內容。

在第二種情況下,catch塊引發異常,所以編譯器知道該方法將返回一個對象或引發異常。

1

在第一種情況下,如果拋出異常沒有返回值,則 函數只是脫落結束時,作爲這是一個錯誤,相同:

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

在第二功能是保證到 返回一個值或拋出一個異常。

如果你真的只是想記錄異常,但你可以寫像第一個例子沒有采取任何其他行動 ,如:

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

儘管它和Bhushan完全一樣,但我喜歡你解釋的方式。 +1 – 2009-11-06 04:10:47

相關問題