2009-11-06 10 views
8

non funziona (errore di compilazione: manca istruzione return)Perché un'istruzione return all'interno di un lavoro di cattura prova con 'tiri'

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

opere:

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

perché?

+0

Cosa intendi per "non funziona"? Cosa succede nel primo caso? – noctonura

+3

Credo fosse abbastanza ovvio. :) –

+0

Dato che ti aspetti che il primo caso funzioni, devo chiedertelo, che cosa ti aspetti che verrà restituito con questo metodo? –

risposta

13

Nel primo caso il metodo non restituisce nulla dopo il blocco catch o all'interno del blocco catch.

Nel secondo caso il blocco catch è un'eccezione in modo compilatore sa che il metodo restituisce un oggetto o di un'eccezione.

1

Nel primo caso, se viene generata l'eccezione non esiste un valore di ritorno, la funzione appena raggiunge la fine, che è un errore, uguale:

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

Nella seconda è garantita la funzione per restituire un valore o generare un'eccezione.

Se davvero si vuole solo registrare l'eccezione, ma non prendere qualsiasi altra azione come nel primo esempio si potrebbe scrivere qualcosa di simile:

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

Come detto Bhushan, il compilatore può vedere in questo caso che succederà sempre qualcosa ci sarà un ritorno o un'eccezione. Nel primo caso se si ottiene un'eccezione di denominazione si finisce in uno stato ambiguo, nulla ritorna da una funzione che contrattualmente deve avere un ritorno.

+0

Anche se è esattamente lo stesso di Bhushan, ma mi è piaciuto il modo in cui hai spiegato. +1 –

Problemi correlati