2010-05-31 10 views
8

Hola a todos, soy nuevo en Java y se preguntaba si se define un método para devolver un objeto de base de datosEn Java, ¿cómo configuro un tipo de devolución si ocurre una excepción?

como

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

    } 

} 

si falla la conexión al intentar crearla lo que debería volver ? eclipse me dice que tengo que devolver un objeto Connection, pero si falla, no estoy seguro de qué hacer.

gracias!

CÓDIGO actualiza para hacerle BURBUJA EXCEPCIÓN:

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, estoy asombrado. Eclipse es normalmente lo suficientemente inteligente como para entender que una vez que arroja algo, no necesita devolver nada. Pero para hacerlo feliz, pon un "retorno nulo"; después del final del bloque de captura. –

+0

@Paul: en realidad, Eclipse solo está descontento con la "Excepción de tipo de excepción no controlada" dentro del catch (throws perdidos). –

Respuesta

5

Si se produce una excepción, no hay valor normal de volver del método. Por lo general, el compilador puede detectar esto, por lo que ni siquiera lo molesta con advertencias/errores de "retorno requerido". A veces, cuando no puede hacerlo, debe dar una declaración de devolución de "coartada", que de hecho nunca se ejecutará.

Redefiniendo el método como este

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

satisfaga Eclipse :-)

Actualización: Como otros han señalado, vuelva a lanzar una excepción en un retén bloquear la manera que lo hizo es no es Buena idea. La única situación en la que es una solución decente es si necesita convertir entre diferentes tipos de excepciones. P.ej. un método llamado arroja un tipo de excepción que no puede o no desea propagar hacia arriba (por ejemplo, porque pertenece a una biblioteca o marco propietario y desea aislar el resto de su código).

Incluso entonces, la forma correcta de volver a lanzar una excepción es pasar la excepción original al constructor nuevo (las excepciones estándar de Java y la mayoría de las excepciones específicas del marco lo permiten). De esta forma, se conserva el seguimiento de la pila y cualquier otra información dentro de la excepción original. También es una buena idea registrar el error antes de volver a lanzar. P.ej.

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 dice que este método debe devolver un tipo de Colección y tiene un icono de error en la línea con la eliminación del método. – James

+1

@beagleguy eso se debe a que hay una ruta de código que no dará como resultado una devolución o un lanzamiento. Sin embargo, el código que publicó aparentemente no está completo ya que no muestra dicha ruta de código. – Yishai

+0

gracias Peter, actualicé mi código para eliminar el try/catch. ¿La segunda versión se ve mejor? – James

1

Ésta es exactamente la situación en la que debe dejar que la excepción se propaga la pila de llamadas (declarar el método como throws SQLException o envolviéndolo en una excepción específica de la aplicación) para que pueda capturar y manejar la situación a un nivel superior nivel.

Ese es todo el punto de las excepciones: puede elegir dónde atraparlos.

5

Debería eliminar su bloque completo try/catch y permitir la propagación de excepciones, con una declaración de excepción apropiada. Esto eliminará el error que Eclipse está informando, y ahora mismo su código está haciendo algo muy malo: al capturar y volver a lanzar todas las excepciones, está destruyendo el seguimiento de pila original y ocultando otra información contenida en el objeto de excepción original.

Además, ¿cuál es el propósito de la línea Class.forName("com.mysql.jdbc.Driver").newInstance();? Está creando un nuevo objeto mysql Driver a través de la reflexión (¿por qué?) Pero no está haciendo nada con él (¿por qué?).

+0

Si no tengo esa línea, sigo obteniendo la excepción: Excepción general: No se encontró un controlador adecuado para jdbc: mysql: /// mydb ¿hay una forma mejor de obtener un objeto de conexión mysql? – James

+1

@beagleguy, veo de Google que este método de creación en realidad se recomienda. Huh. Supongo que los escritores de jdbc nunca han oído hablar de Dependency Injection. –

1

Nunca, nunca, nunca use una excepción genérica como esa. Si no tiene una excepción lista (en este caso, una excepción SQLException), haga su propio tipo de excepción y ejecútelo.Cada vez que encuentro algo que declara que "arroja Excepción", y resulta que lo hace porque algo que llama declara "arroja una excepción", y así sucesivamente, quiero estrangular al idiota que comenzó esa cadena de declaraciones

0

Lo siento, pero no debería escribir código como este, incluso si es nuevo en Java.

Si tiene que escribir una cosa así, que lo lograría la misma familia:

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

Y también se debe tener en cuenta que los conjuntos de conexiones son el verdadero camino a seguir para otra cosa que un simple, aplicación de una sola rosca.

0

prueba este

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



} 
Cuestiones relacionadas