2009-11-06 11 views
8

nie działa (błąd kompilacji: brak instrukcji return)Dlaczego return wewnątrz pracy catch spróbuj 'rzuca'

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

działa:

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

dlaczego?

+0

Co masz na myśli "nie działa"? Co dzieje się w pierwszym przypadku? – noctonura

+3

Uważam, że było to dość oczywiste. :) –

+0

Ponieważ spodziewasz się, że pierwszy przypadek zadziała, muszę zapytać, czego dokładnie oczekuje się, że zostanie zwrócona przez tę metodę? –

Odpowiedz

13

W pierwszym przypadku metoda nie zwraca niczego po bloku catch lub wewnątrz bloku catch.

W drugim przypadku blok catch rzuca wyjątek, więc kompilator wie, że metoda zwróci obiekt lub wyrzuci wyjątek.

1

W pierwszym przypadku, jeśli jest wyjątek nie ma wartości powrotu, funkcja tylko spadnie ten koniec, który jest błędem, jak poniżej:

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

W drugiej funkcji jest zagwarantowane do Zwróć wartość lub wyrzuć wyjątek.

Jeśli naprawdę chcą się zalogować wyjątek, ale nie podejmować żadnych innych działań jak w pierwszym przykładzie można napisać coś takiego:

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

Jak wspomniano Bhushan, kompilator widzi w tym przypadku że coś zawsze się wydarzy, nastąpi powrót lub wyjątek. W pierwszym przypadku, jeśli otrzymasz Wyjątek Nazewnictwa, skończysz w niejednoznacznym stanie, nic nie wróci z funkcji, która na mocy umowy musi mieć zwrot.

+0

Mimo, że jest dokładnie taki sam jak Bhushan stwierdził, ale podobał mi się sposób, w jaki wyjaśniłeś. +1 –

Powiązane problemy