我已经尽可能地从各个帖子中建立了这个课程。
我正在尝试从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();
但是,我收到错误必须被捕获或声明被抛出。我做错了什么?
答案 0 :(得分:3)
你的方法: -
public ArrayList<String> LoadUsers() throws SQLException {
在其throws子句中声明了SQLException
。因此,无论从哪种方法调用此方法,您都需要将invocation
括在try-catch
块中来处理此异常,或者在该方法的throws子句中声明此异常。 / p>
因此,假设您从方法caller()
调用方法。
因此,您有两种选择: -
在throws
的{{1}}子句中声明例外: -
caller
将方法调用包含在try-catch中。在这种情况下,请记住首先在块外声明public void caller() throws SQLException {
ArrayList<String> players = database.LoadUsers();
}
:
list
注意,如果您使用的是第一个选项,那么您将在调用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
}
不建议使用最后一个选项。