2010-05-31 13 views
8

Ciao a tutti, sono nuovo a Java e chiedevo se mi definisco un metodo per restituire un oggetto di databaseIn Java, come si imposta un tipo di ritorno se si verifica un'eccezione?

come

import java.sql.*; 

public class DbConn { 

    public Connection getConn() { 
     Connection conn; 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      if(System.getenv("MY_ENVIRONMENT") == "development") { 
       String hostname = "localhost"; 
       String username = "root"; 
       String password = "root"; 
      } 
      conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
      return conn; 
     } catch(Exception e) { 
      throw new Exception(e.getMessage()); 
     } 

    } 

} 

se la connessione non riesce quando provo a crearla cosa devo tornare ? eclipse mi sta dicendo che devo restituire un oggetto Connection ma se fallisce non sono sicuro di cosa fare.

grazie!

codice aggiornato AFFITTO ECCEZIONE DELLA BOLLA:

public class DbConn { 

    public Connection getConn() throws SQLException { 
     Connection conn; 
     String hostname = "localhost"; 
     String username = "root"; 
     String password = "root"; 

     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if(System.getenv("MY_ENVIRONMENT") != "development") { 
      hostname = "localhost"; 
      username = "produser"; 
      password = "prodpass"; 
     } 
     conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
     return conn; 

    } 

} 
+0

Francamente, sono stupito. Eclipse è normalmente abbastanza intelligente da capire che una volta lanciato qualcosa, non è necessario restituire nulla. Ma per renderlo felice, metti un "return null"; dopo la fine del blocco catch. –

+0

@Paul: in realtà Eclipse non è soddisfatto di "Eccezione tipo eccezione non gestita" all'interno del fermo (mancini). –

risposta

5

Se viene generata un'eccezione, non v'è alcun valore normale restituito dal metodo. Di solito il compilatore è in grado di rilevare questo, quindi non ti disturba nemmeno con gli avvertimenti/errori di stile "return required". A volte, quando non è in grado di farlo, è necessario fornire una dichiarazione di ritorno "alibi", che in realtà non verrà mai eseguita.

Ridefinire il vostro metodo come questo

public Connection getConn() { 
    Connection conn = null; 
    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if(System.getenv("MY_ENVIRONMENT") == "development") { 
      String hostname = "localhost"; 
      String username = "root"; 
      String password = "root"; 
     } 
     conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
    } catch(Exception e) { 
     // handle the exception in a meaningful way - do not just rethrow it! 
    } 
    return conn; 
} 

soddisferà Eclipse :-)

Aggiornamento: Come altri hanno sottolineato, ri-lanciare un'eccezione in un fermo bloccare il modo che hai fatto è non è una buona idea. L'unica situazione in cui è una soluzione decente è se è necessario convertire tra diversi tipi di eccezione. Per esempio. un metodo chiamato genera un tipo di eccezione che non puoi o non vuoi propagare verso l'alto (ad esempio perché appartiene a una libreria o un framework proprietario e vuoi isolare il resto del tuo codice da esso).

Anche in questo caso, il modo corretto per rilanciare un'eccezione è passare l'eccezione originale nel costruttore del nuovo (eccezioni Java standard e la maggior parte delle eccezioni specifiche della struttura consentono questo). In questo modo viene conservata la traccia dello stack e qualsiasi altra informazione all'interno dell'eccezione originale. È anche una buona idea registrare l'errore prima di rilanciare. Per esempio.

public void doSomething() throws MyException { 
    try { 
     // code which may throw HibernateException 
    } catch (HibernateException e) { 
     logger.log("Caught HibernateException", e); 
     throw new MyException("Caught HibernateException", e); 
    } 
} 
+0

Eclipse sta dicendo che questo metodo deve restituire un tipo di Collection e ha un'icona di errore nella riga con il metodo delcaration. – James

+1

@beagleguy è perché c'è un percorso di codice che non si tradurrà in un ritorno o un lancio. Tuttavia, il codice che hai postato apparentemente non è completo in quanto non mostra tale percorso di codice. – Yishai

+0

grazie Peter, ho aggiornato il mio codice per rimuovere il try/catch .. La seconda versione ha un aspetto migliore? – James

1

Questa è esattamente la situazione in cui si dovrebbe lasciare che l'eccezione si propagano lo stack di chiamate (dichiarando il metodo come throws SQLException o avvolgendolo in una specifica deroga per l'applicazione) in modo che si può prendere e gestirlo in un più alto livello.

Questo è il punto di eccezione: puoi scegliere dove catturarli.

5

È necessario eliminare l'intero blocco try/catch e consentire la propagazione delle eccezioni, con un'apposita dichiarazione di eccezione. Questo eliminerà l'errore segnalato da Eclipse, e in questo momento il tuo codice sta facendo qualcosa di molto brutto: catturando e rilanciando tutte le eccezioni, stai distruggendo la traccia dello stack originale e nascondendo altre informazioni contenute nell'oggetto eccezione originale.

Inoltre, qual è lo scopo della linea Class.forName("com.mysql.jdbc.Driver").newInstance();? Stai creando un nuovo oggetto mysql Driver attraverso il riflesso (perché?) Ma non stai facendo nulla con esso (perché?).

+0

Se non ho questa linea continuo ad ottenere l'eccezione: Eccezione generale: nessun driver adatto trovato per jdbc: mysql: /// mydb c'è un modo migliore per ottenere un oggetto di connessione mysql? – James

+1

@ beagleguy, vedo da Google che questo metodo di creazione è in realtà raccomandato. Huh. Immagino che gli scrittori di jdbc non abbiano mai sentito parlare di Dipendenza da Iniezione. –

1

Mai e poi mai usare un'eccezione generica come quella. Se non si dispone di un'eccezione pronta (in questo caso, una SQLException), creare il proprio tipo di eccezione e lanciarlo.Ogni volta che incontro qualcosa che dichiara che "lancia Eccezione", e si scopre che lo fa perché qualcosa che chiama dichiara "lancia Eccezione", e così via, voglio strangolare l'idiota che ha iniziato quella catena di dichiarazioni.

0

Mi dispiace, ma non dovresti scrivere codice come questo, anche se sei nuovo in Java.

Se è necessario scrivere una cosa del genere, mi rendono più simile a questo:

public class DatabaseUtils 
{ 

    public static Connection getConnection(String driver, String url, String username, String password) throws SQLException 
    { 
     Class.forName(driver).newInstance(); 


     return DriverManager.getConnection(url, username, password); 
    } 
} 

e si dovrebbe anche essere consapevoli del fatto che i pool di connessione sono la vera strada da percorrere per qualcosa di diverso da una semplice, applicazione a thread singolo.

0

provare questo

public ActionForward Login(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) { 
    MigForm migForm = (MigForm) form;// TODO Auto-generated method stub 

    Connection con = null; 
    Statement st = null; 
    ResultSet rs = null; 

    String uname=migForm.getUname(); 
    String pwd=migForm.getPwd(); 

    try{ 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","uname","pwd"); 
     if(con.isClosed()) 
     { 
      return mapping.findForward("success"); 
     } 

     //st=con.createStatement(); 

     }catch(Exception err){ 

     System.out.println(err.getMessage()); 
     } 


      return mapping.findForward("failure"); 



} 
Problemi correlati