Java MySQL-必须捕获或声明要抛出
我已经尽我所能从不同的岗位上建立了这个班级 我试图从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
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 {
列表
:
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