【问题标题】:How to handle Exception in Java JDBC?如何处理 Java JDBC 中的异常?
【发布时间】:2015-11-04 04:33:00
【问题描述】:

我正在尝试在 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 块,也只是在会话部分周围,但没有什么对我不起作用。谁能帮我解决这个问题?

【问题讨论】:

  • 你需要在try catch块之外声明Connection对象,它的作用域是有限的。

标签: java jdbc exception-handling


【解决方案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;
      }

【讨论】:

    【解决方案2】:

    由于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
         }
    }
    

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

    【讨论】:

    • 领先我 2 秒
    • 我建议把它放在另一个问题中。老实说,我不知道你的问题是什么,因为这个问题的措辞很不清楚。什么是行不通的?唯一可能引发异常的是 Session.getInstance 并且您应该能够围绕它包装一个 try-catch。我会更新我的答案。
    • 问题出在我有 SQLException 而不是 RuntimeException 的 catch 块内。
    • 为什么 javax.mail 代码应该抛出 SQLException?这与您当时使用的代码相同吗?无论如何,您当然也可以捕获 SQLException 而不是 RuntimeException(我之所以选择它是因为 afaik 它是那里唯一可能的)。
    • 我只是错误地将 SQLException 而不是运行时。
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2015-09-16
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多