如何在Java JDBC中处理异常?

时间:2015-08-11 19:34:33

标签: java jdbc exception-handling

我正在尝试将Java中的try / catch块放在我的连接上。以下是我的代码示例:

public static Connection getConnection() throws Exception, SQLException {
        try{
        String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String url = "jdbc:sqlserver://IP\\:Port;databaseName=DB";
        String username = "username";
        String password = "password";
        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, username, password);
        }catch (SQLException e){
            System.out.println(e.getMessage());
        }
        return conn;
      }

我的代码在线上给出错误我的 * return conn; * !说:conn无法解析为变量。

此外,我想在我的PasswordAuthentication周围放置try catch块,但我尝试的所有内容都不适用于我。这是我的部分代码:

class EmailSender{
    private Session session;
    //Checking for authentication, taking host and port information
    private void init(){
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "IP");
        props.put("mail.smtp.port", "PORT");

        session = Session.getInstance(props,
                  new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        //returning user name and password to connect to email server
                        return new PasswordAuthentication("Username", "password");
                    }
                  });
    }

我尝试将try / catch块放在这部分的整个代码中,也只是围绕会话部分,但没有什么对我不起作用。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

由于在conn中定义了try { ... },因此在该块之外不知道它(变量具有已知的“范围”)。你有两个选择:

a)在尝试之前声明你的conn并将其分配到...

Connection conn = null;
try {
   conn = ...;

b)将您的回报移至try区块内,并在结尾处移动return null。这样,如果一切正常,它将返回conn,如果异常被捕获,则返回null。

对于第二部分,我不明白为什么围绕Session.getInstance()包装try catch会有任何问题:

private void init(){
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", "IP");
    props.put("mail.smtp.port", "PORT");

    try {

      session = Session.getInstance(props,
              new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    //returning user name and password to connect to email server
                    return new PasswordAuthentication("Username", "password");
                }
              });
     } catch(RuntimeException e) {
         e.printStackTrace(); // for example
     }
}

当然这只会阻止该方法进一步抛出异常。会导致会话为空。

答案 1 :(得分:1)

向Florian Schaetz的答案添加一个重点。

对于案例一,应该有两个catch块

对于

Class.forName("com.mysql.jdbc.Driver"); 

我们应该抓住ClassNotFoundException

Connection conn = DriverManager.getConnection(url, username, password);

我们应该抓住SQLException

所以你的最终代码应该有两个catch块

public static Connection getConnection() throws Exception, SQLException {
        try{
        String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String url = "jdbc:sqlserver://IP\\:Port;databaseName=DB";
        String username = "username";
        String password = "password";
        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, username, password);
        }catch (ClassNotFoundException e){
            System.out.println(e.getMessage());
        }
        catch (SQLException e){
            System.out.println(e.getMessage());
        }
        return conn;
      }