Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL-必须捕获或声明要抛出_Java_Mysql_Sql - Fatal编程技术网

Java MySQL-必须捕获或声明要抛出

Java MySQL-必须捕获或声明要抛出,java,mysql,sql,Java,Mysql,Sql,我已经尽我所能从不同的岗位上建立了这个班级 我试图从MySQL数据库中获取用户名列表 以下是检索它们的方法: public ArrayList<String> LoadUsers() throws SQLException { ArrayList<String> players = new ArrayList<String>(); try { Connection conn = null; ResultSet r

我已经尽我所能从不同的岗位上建立了这个班级

我试图从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;
}
public ArrayList LoadUsers()引发SQLException{
ArrayList players=新的ArrayList();
试一试{
连接conn=null;
结果集rs=null;
试一试{
conn=getConnection();
语句s=conn.createStatement();
s、 executeQuery(“从NFT_用户中选择*);
rs=s.getResultSet();
while(rs.next()){
players.add(rs.getString(“name”);
}
rs.close();
s、 关闭();
}
catch(SQLException-ex){
System.out.println(例如toString());
}
最后{
试试{
如果(conn!=null)连接关闭();
} 
catch(SQLException-ex){
System.out.println(“关闭时:+ex.toString());
} 
}
} 
捕获(例外情况除外){
//微量元素(ex);
}
返回球员;
}
这是我的mainclass中的代码,它从方法中检索它:

    ArrayList<String> players = database.LoadUsers();
arraylistplayers=database.LoadUsers();
但是,我得到的错误必须被捕获或声明为抛出。我做错了什么?

您的方法:-

public ArrayList<String> LoadUsers() throws SQLException {
  • 将方法调用包含在try-catch中。在这种情况下,请记住首先在块外声明您的
    列表

    public void caller() {
         ArrayList<String> players = null;
         try {
              players = database.LoadUsers();
         } catch (SQLException e) {
              e.printStackTrace();
         }
    }
    
    public void caller(){
    ArrayList players=null;
    试一试{
    players=database.LoadUsers();
    }捕获(SQLE异常){
    e、 printStackTrace();
    }
    }
    
  • 注意如果使用第一个选项,那么调用
    调用者的方法将再次面临相同的问题。在那里,你也必须遵循这一点

    通常,在方法中引发的异常会在那里使用try-catch块进行处理,或者沿着堆栈跟踪向上传播到立即调用方方法,,但不能同时传播这两种方法。你用你的方法做到了这两个。您正在处理异常,并已在
    throws
    子句中声明要抛出该异常。你不应该这样做。

    你的方法:-

    public ArrayList<String> LoadUsers() throws SQLException {
    
  • 将方法调用包含在try-catch中。在这种情况下,请记住首先在块外声明您的
    列表

    public void caller() {
         ArrayList<String> players = null;
         try {
              players = database.LoadUsers();
         } catch (SQLException e) {
              e.printStackTrace();
         }
    }
    
    public void caller(){
    ArrayList players=null;
    试一试{
    players=database.LoadUsers();
    }捕获(SQLE异常){
    e、 printStackTrace();
    }
    }
    
  • 注意如果使用第一个选项,那么调用
    调用者的方法将再次面临相同的问题。在那里,你也必须遵循这一点

    通常,在方法中引发的异常会在那里使用try-catch块进行处理,或者沿着堆栈跟踪向上传播到立即调用方方法,,但不能同时传播这两种方法。你用你的方法做到了这两个。您正在处理异常,并已在
    throws
    子句中声明要抛出该异常。你不应该那样做。

    试试这个

    try{
       ArrayList<String> players = database.LoadUsers();
    }catch(SQLException e){e.printStackTrace();}
    
    试试看{
    ArrayList players=database.LoadUsers();
    }catch(SQLException e){e.printStackTrace();}
    
    这是因为loadUsers方法正在引发异常。因此,无论您在哪里调用此方法,都需要用try-catch将其包围起来

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

    这是因为loadUsers方法正在引发异常。因此,无论在何处调用此方法,都需要使用try-catch将其包围起来,正如我在前面的评论中提到的,声明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 ArrayList LoadUsers()引发SQLException{
    ArrayList players=新的ArrayList();
    试一试{
    连接conn=null;
    结果集rs=null;
    试一试{
    conn=getConnection();
    语句s=conn.createStatement();
    s、 executeQuery(“从NFT_用户中选择*);
    rs=s.getResultSet();
    while(rs.next()){
    players.add(rs.getString(“name”);
    }
    rs.close();
    s、 关闭();
    }最后{
    试试{
    如果(conn!=null)连接关闭();
    }catch(SQLException-ex){
    //吃这个例外——我们在这里无能为力
    } 
    }
    } 
    返回球员;
    }
    
    在呼叫者中:

    public void processPlayers() {
       try{
           ArrayList<String> players = database.LoadUsers();
          // do something with the players
    
       } catch(SQLException ex){
    
         ex.printStackTrace();
      }
    }
    
    public void processPlayers(){
    试一试{
    ArrayList players=database.LoadUsers();
    //对球员们做点什么
    }catch(SQLException-ex){
    例如printStackTrace();
    }
    }
    
    第二个选项使用相同的LoadUsers()方法,但也不捕获调用方中的异常-它将异常传递给调用方:

    public void processPlayers()引发SQLException{
    ArrayList players=database.LoadUsers();
    //对球员们做点什么
    }
    
    第三个选项是在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 ArrayList LoadUsers()引发SQLException{
    ArrayList players=新的ArrayList();
    试一试{
    连接conn=null;
    结果集rs=n