MySQL - 必须被捕获或声明被抛出

时间:2012-11-30 21:22:23

标签: java mysql sql

我已经尽可能地从各个帖子中建立了这个课程。

我正在尝试从MySQL数据库中获取用户名列表。

以下是检索它们的方法:

public ArrayList<String> LoadUsers() throws SQLException {
    ArrayList<String> players = new ArrayList<String>();
    try {
        Connection conn = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            Statement s = conn.createStatement ();
            s.executeQuery ("SELECT * FROM NFT_users");
            rs = s.getResultSet ();

            while(rs.next ()){
                players.add(rs.getString("name"));
            }
            rs.close ();
            s.close ();
        }

        catch (SQLException ex) { 
            System.out.println(ex.toString()); 
        }

        finally { 
            try { 
                if (conn != null) conn.close(); 
            } 

            catch (SQLException ex) { 
                System.out.println("On close: " + ex.toString()); 
            } 
        }
    } 

    catch(Exception ex) { 
        //trace(ex); 
    }

    return players;
}

这是我的mainclass中的代码,它从方法中检索它:

    ArrayList<String> players = database.LoadUsers();

但是,我收到错误必须被捕获或声明被抛出。我做错了什么?

3 个答案:

答案 0 :(得分:3)

你的方法: -

public ArrayList<String> LoadUsers() throws SQLException {

在其throws子句中声明了SQLException。因此,无论从哪种方法调用此方法,您都需要将invocation括在try-catch块中来处理此异常,或者在该方法的throws子句中声明此异常。 / p>

因此,假设您从方法caller()调用方法。

因此,您有两种选择: -

  1. throws的{​​{1}}子句中声明例外: -

    caller
  2. 将方法调用包含在try-catch中。在这种情况下,请记住首先在块外声明public void caller() throws SQLException { ArrayList<String> players = database.LoadUsers(); }

    list
  3. 注意,如果您使用的是第一个选项,那么您将在调用public void caller() { ArrayList<String> players = null; try { players = database.LoadUsers(); } catch (SQLException e) { e.printStackTrace(); } } 的方法中再次面临同样的问题。你也必须遵循这个。

    通常,方法内部引发的异常是 - 使用try-catch块在那里处理,或者在堆栈跟踪中向上传播到直接调用方法但不是两者。你正在用你的方法做两件事。您正在处理异常,并已将其声明为在caller子句中抛出。你永远不应该这样做。

答案 1 :(得分:0)

试试这个

try{
   ArrayList<String> players = database.LoadUsers();
}catch(SQLException e){e.printStackTrace();}

这是因为你的loadUsers方法抛出异常。因此,无论您在何处调用此方法,都需要使用try catch

将其包围

答案 2 :(得分:0)

正如我在之前的评论中提到的,声明LoadUsers方法抛出异常,然后永远不抛出异常并不是一个好主意。这提高了调用者应该准备好处理异常的期望,实际上,编译器将要求调用者用try / catch块包围调用,或者声明它抛出异常。

所以,(至少)有三种选择。 第一种是使LoadUsers方法实际抛出异常,如下所示:

public ArrayList<String> LoadUsers() throws SQLException {
    ArrayList<String> players = new ArrayList<String>();
    try {
        Connection conn = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            Statement s = conn.createStatement ();
            s.executeQuery ("SELECT * FROM NFT_users");
            rs = s.getResultSet ();

            while(rs.next ()){
                players.add(rs.getString("name"));
            }
            rs.close ();
            s.close ();
        } finally { 
            try { 
                if (conn != null) conn.close(); 
            } catch (SQLException ex) { 
                // eat the exception - we can't do anything about it here 
            } 
        }
    } 

    return players;
}

并且在来电者中:

public void processPlayers() {
   try{
       ArrayList<String> players = database.LoadUsers();
      // do something with the players

   } catch(SQLException ex){

     ex.printStackTrace();
  }
}

第二个选项使用相同的LoadUsers()方法,但不会在调用者中捕获异常 - 它将其传递给调用者:

public void processPlayers() throws SQLException {
      ArrayList<String> players = database.LoadUsers();
      // do something with the players
}

第三个选项是在LoadUsers方法中捕获异常,而不是在调用者中捕获异常。 这里的问题是调用者不会知道存在问题 - 它只会得到一个空列表:

public ArrayList<String> LoadUsers() throws SQLException {
    ArrayList<String> players = new ArrayList<String>();
    try {
        Connection conn = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            Statement s = conn.createStatement ();
            s.executeQuery ("SELECT * FROM NFT_users");
            rs = s.getResultSet ();

            while(rs.next ()){
                players.add(rs.getString("name"));
            }
            rs.close ();
            s.close ();
        } catch(SQLException ex) {
            ex.printStackTrace(); // but the caller won't know...
        }
          finally { 
            try { 
                if (conn != null) conn.close(); 
            } catch (SQLException ex) { 
                // eat the exception - we can't do anything about it here 
            } 
        }
    } 

    return players;
}

public void processPlayers() throws SQLException {
      ArrayList<String> players = database.LoadUsers(); // an empty list if something went wrong
      // do something with the players
}

不建议使用最后一个选项。