0

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

我正在尝试从 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;
}

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

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

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

4

3 回答 3

3

你的方法: -

public ArrayList<String> LoadUsers() throws SQLException {

SQLException在它的 throws 子句中声明了一个。因此,无论从哪个方法调用此方法,您都需要将 括invocation在一个try-catch块中以处理此异常,或者也在该方法的 throws 子句中声明此异常。

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

所以,你有两个选择: -

  1. throws在以下子句中声明例外caller:-

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

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

请注意,如果您使用第一个选项,那么您将再次在调用caller. 你也必须遵循这件事。

通常,方法内部引发的异常 - 要么使用 try-catch 块在那里处理,要么沿着堆栈跟踪传播到直接调用者方法,但不能同时使用两者。你正在用你的方法做这两件事。您正在处理异常,并已声明它也将在throws子句中抛出。你不应该那样做。

于 2012-11-30T21:24:02.237 回答
0

尝试这个

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

这是因为您的 loadUsers 方法正在引发异常。所以,无论你在哪里调用这个方法,你都需要用 try catch 包围它

于 2012-11-30T21:27:00.837 回答
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
}

不推荐使用最后一个选项。

于 2012-11-30T21:53:34.263 回答