2017-01-25 3 views
1

シングルトンクラスを理解するためのデータベースクラスを作成しました。報告されていない例外SQLExceptionがキャッチされる、またはスローされると宣言する必要があります

コール

private Connection con = ConnectionManager.getConnection();

Netbeansのは、私が

public static Connection getConnection() throws SQLException { 
    boolean read = ReadFromConfig(); 
    if (read == true) { 
     try { 
      con = DriverManager.getConnection(urlstring, user, pass); 
     } catch (SQLException ex) { 
      throw new SQLException("Connection failed: " + ex); 
     } 
    } 
    return con; 
} 
+3

'getConnection()'の 'try-catch'ブロックは役に立たないだけでなく、有害です。それは元の 'SQLException'を破壊し、その理由に関する情報を失っています。 'getConnection()'を呼び出すコードで例外を処理する必要があります。 – Kayaman

+0

私はあなたが新しい例外を作成していると思います: "新しいSQLExceptionをスローする("失敗しました: "+ ex);"私はこの行を次のように置き換えます: "** System.out.println(" Connection failed: "); ex.printStackTrace(); **"これを行うと、最初の(そして真の)例外が維持され、コンソールは到達した場合にエラーを出力します。 – Amnor

+0

_your_ 'getConnection'のシグネチャは、SQLExceptionをスローする可能性があることをコンパイラに伝えます。このコードをtry catchブロックにカプセル化する必要があります(SQLExceptionをスローする' DriverManager.getConnection'と同じように)。しかし、これはキャッチして新しいものを投げるのは悪いデザインです。 – AxelH

答えて

0

が、私は問題は静的getConnection()関数呼び出しによって引き起こされていると思われるのgetConnectionメソッドをここに報告されていない例外がありますが、ここであることを教えて。 SQLException(メソッドシグネチャthrows SQLExceptionでこれを定義する)を呼び出すメソッドを定義しているため、呼び出すときに、発生可能なスローされた例外を呼び出し時にキャッチする必要がある場合を追加する必要があります。次のコードは、問題を解決する方法を示しています。

public class Test { 
    public static int getConnection() throws Exception 
    { 
    int result = 1; 
    try 
    { 
     result = 2; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Connection failed: " + ex); 
    } 
    return result; 
    } 

    public static void main(String[] args) { 
    try 
    { 
     Test.getConnection(); 
    } 
    catch (Exception e) 
    { 
     // do something 
    } 
    } 
} 
関連する問題