在我的应用程序中,我通过ip地址通信从另一个系统数据库访问数据。
因此,如果数据库系统在此时处于脱机状态,则在连接期间发生异常,因此在catch块中我再次调用run()方法,当它到达联机正常的应用程序执行流程时。但是在这个过程中我得到了"线程中的异常"线程-1" java.lang.StackOverflowError的"这个例外如何在我的场景中解决这个异常。
这是我的代码:
MAIN CLASS :-
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new LsduJFrame().setVisible(true);
}
});
new Thread(new DisplayPlazaNameLocation()).start();// i am calling here
}
DisplayPlazaNameLocation:-
public class DisplayPlazaNameLocation implements Runnable{
static String plazaNameLocation;
static Connection con;
int i =0;
public void getPlazaNameLocation(){
try {
System.out.println("in getPlazaNameLocation()==============================================");
PreparedStatement pst=con.prepareStatement("SELECT DISTINCT Plaza_Loc FROM lsdu_live");
ResultSet rs = pst.executeQuery();
while(rs.next()){
plazaNameLocation = rs.getString("Plaza_Loc");
//System.out.println(plazaNameLocation);
}
String ar[] = plazaNameLocation.split(",");
jLabel199.setText("<html>"+ar[0]+"<br>"+ar[1]+"</html>");
rs.close();
pst.close();
con.close();
} catch (SQLException ex) {
run();
}
}
@Override
public void run(){
try {
Class.forName(DB_DRIVER_CLASS);
con= DriverManager.getConnection(DB_URL[0],DB_USERNAME,DB_PASSWORD);
if(con != null){
this.getPlazaNameLocation();}
} catch (ClassNotFoundException ex) {
run();
} catch (SQLException ex) {
run();
}
}
}
执行一段时间后,我收到此异常Exception in thread "Thread-1" java.lang.StackOverflowError
假设我在获取此异常之前解决了Connection问题,应用程序运行正常,但在获得此异常后,在此时获取此异常后不再使用resolve我需要关闭应用程序并在那时再次打开它&#39工作。 How to resolve this issue with respect to my code ?
stackTrace() data:-
Exception in thread "Thread-1" java.lang.StackOverflowError
at java.lang.Exception.<init>(Exception.java:66)
at java.sql.SQLException.<init>(SQLException.java:70)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:435)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at lsdu_application.DisplayPlazaNameLocation.run(DisplayPlazaNameLocation.java:47)
at lsdu_application.DisplayPlazaNameLocation.run(DisplayPlazaNameLocation.java:59)
at
答案 0 :(得分:5)
在run
方法中,您拨打getPlazaNameLocation
。如果SQL失败,则再次调用run
。这导致无限循环&#34;这两种方法之间的(递归),每次调用都会添加到你的调用堆栈中,最终导致StackOverflowError
。
run
?您应该处理catch块中的错误,而不是重新启动您的功能。移除该电话,并使用SQLException
。e.printStackTrace()
的一些信息
run
。应该使用Thread.start()
。编辑:如果你真的想重新尝试数据库操作以防它失败,试试这个:
public void getPlazaNameLocation() throws SQLException {
//same code, but remove the try/catch blocks and
// especially the run()!
}
@Override
public void run(){
try {
Class.forName(DB_DRIVER_CLASS);
con = DriverManager.getConnection(DB_URL[0],DB_USERNAME,DB_PASSWORD);
} catch (ClassNotFoundException ex) {
e.printStackTrace();
//fail here since no driver was found
return;
}
boolean retry = true;
while(retry){
try {
getPlazaNameLocation();
retry = false;
} catch (SQLException ex) {
//if we arrive here, "retry" will still have a value of true
}
}
}
请注意,我不建议通过与此代码相关的数据库断开连接发送垃圾邮件请求。