2010-05-31 8 views
8

Привет всем, я новичок в Java, и было интересно, если я определить метод для возврата объекта базы данныхВ Java, как установить тип возвращаемого значения, если возникает исключение?

нравится

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

    } 

} 

, если не удается установить соединение, когда я пытаюсь создать его, что я должен вернуться ? eclipse говорит мне, что мне нужно вернуть объект Connection, но если он не работает, я не уверен, что делать.

спасибо!

ОБНОВЛЕНО КОД ПРЕПЯТСТВОВАТЬ EXCEPTION ПУЗЫРЬ:

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

Честно говоря, я удивлен. Eclipse обычно достаточно умна, чтобы понять, что как только вы что-то бросаете, вам ничего не нужно возвращать. Но чтобы сделать его счастливым, поставьте «return null»; после окончания блока catch. –

+0

@Paul: на самом деле Eclipse только недовольны «Исключением исключенного типа исключений» внутри улова (пропущенные броски). –

ответ

5

Если исключение, не существует нормальное значение, возвращаемое методом. Обычно компилятор способен обнаружить это, поэтому он даже не пристает к вам с предупреждениями о возврате стиля возврата. Иногда, когда он не может этого сделать, вам нужно предоставить оператор возврата «alibi», который на самом деле никогда не будет выполнен.

Переосмысление ваш метод, как это

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

удовлетворит ECLIPSE :-)

Update: Как уже отмечалось, повторное метания исключение в улове преградить путь вы сделали это не хорошая идея. Единственная ситуация, когда это достойное решение, - это если вам нужно преобразовать разные типы исключений. Например. метод, называемый throws тип исключения, который вы не можете или не хотите распространять вверх (например, потому что он принадлежит запатентованной библиотеке или структуре, и вы хотите изолировать остальную часть своего кода от него).

Даже тогда правильный способ повторного исключения исключений - передать исходное исключение в конструктор нового (стандартные исключения Java и большинство исключений для конкретной структуры допускают это). Таким образом сохраняется трассировка стека и любая другая информация в исходном исключении. Также полезно зарегистрировать ошибку перед повторной установкой. Например.

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 заявляет, что этот метод должен возвращать тип коллекции и имеет значок ошибки в строке с методом delcaration. – James

+1

@beagleguy, потому что есть путь кода, который не приведет к возврату или броску. Однако код, который вы опубликовали, по-видимому, не является полным, так как он не показывает такой путь кода. – Yishai

+0

спасибо Питер, я обновил свой код, чтобы удалить try/catch. Вторая версия выглядит лучше? – James

1

Это как раз та ситуация, когда вы должны позволить исключение распространяется стек вызовов (объявляющий метод как throws SQLException или оборачивать его в конкретных приложений исключения), так что вы можете поймать и обработать его на более высоком уровень.

Вот и все исключения: вы можете выбрать, где их поймать.

5

Вы должны просто исключить весь блок try/catch и разрешить распространение исключений с соответствующей декларацией исключения. Это устранит ошибку, которую Eclipse сообщает, плюс прямо сейчас ваш код делает что-то очень плохое: вылавливая и перебрасывая все исключения, вы уничтожаете исходную трассировку стека и скрываете другую информацию, содержащуюся в исходном объекте исключения.

Плюс, что является целью линии Class.forName("com.mysql.jdbc.Driver").newInstance();? Вы создаете новый объект mysql Driver через отражение (почему?), Но вы ничего не делаете с ним (почему?).

+0

Если у меня нет этой строки, я получаю исключение: Общее исключение: не найдено подходящего драйвера для jdbc: mysql: /// mydb есть ли лучший способ получить объект соединения mysql? – James

+1

@beagleguy, я вижу от Google, что этот метод создания действительно рекомендуется. Да. Я думаю, что авторы jdbc никогда не слышали об Injection Dependency. –

1

Никогда, никогда, никогда не используйте такое общее исключение. Если у вас нет готового исключения (в данном случае SQLException), создайте свой собственный тип исключения и выбросите его.Каждый раз, когда я сталкиваюсь с чем-то, объявляющим, что он «выбрасывает исключение», и получается, что он делает это, потому что что-то, что он вызывает, объявляет «throws Exception», и так далее по линии, я хочу задушить идиота, который начал эту цепочку деклараций.

0

Прошу прощения, но вы не должны писать такой код, даже если вы новичок в Java.

Если вы должны написать такую ​​вещь, я хотел бы сделать это примерно так:

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

И вы также должны знать, что пулы соединений являются верным способом пойти на что-либо иное, чем простое, однопоточное приложение.

0

Попробуйте один

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



}