2016-07-13 4 views
-5

私のアプリケーションでは、私は別のシステムデータベースからIPアドレス通信を介してデータにアクセスしています。"スレッドの例外" Thread-1 "java.lang.StackOverflowError"を解決するには?私のアプリケーションで

そのため、データベースシステムがオフラインになっている場合、接続中に例外が発生するため、キャッチブロックで再び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

を取得していますいくつかの時間を実行した後:

この

は私のコードですしかし、この例外を取得した後は、その時点でこの例外を取得した後に解決を使用することはできません。アプリケーションを閉じて、その時点で再度開く必要があります。あなたの run方法で 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 
+1

スタックトレースを添付できますか? – avojak

+0

完全なスタックトレースを追加します。 – basic

+0

例外が発生した場合は、 'run()'をもう一度呼び出すだけです。第2、第3、または第5000時間の間に何が起こると思いますか?それはあなたが十分に長く再試行すると、自動的には動作しません。 –

答えて

5

、あなたはgetPlazaNameLocationを呼び出します。 SQLが失敗した場合は、runに再度呼び出します。これにより、2つのメソッド間で無限の「ループ」(再帰)が発生し、呼び出しごとに呼び出しスタックに追加され、最終的にStackOverflowErrorが発生します。

  • なぜSQLExceptionの場合にrunを呼び出しますか? catchブロックでエラーを処理し、機能を再開しないでください。その電話を削除し、SQLExceptionについての情報をe.printStackTrace()としてください。
  • runを手動で呼び出すことはありません。これはThread.start()を使用して呼び出されるはずです。

EDIT:あなたは本当にそれが失敗した場合のデータベース操作を再試行したい場合は、これを試してみてください。

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 
    } 
    } 
} 

私は、データベースへの接続が切断されかけスパムリクエストをお勧めしませんのでご注意くださいこのコードのように。

+0

私は少し遅れています:) –

+0

応答を与えるためにありがとう:最初のgetPlazaNameLocation()メソッドを呼び出しているその後、run()でok - その時点で他のシステムのデータベースにアクセスするネットワークとの接続問題ですcatchブロックで再びその時間私は再接続のためのrun()を呼び出しています。代わりに、私はこのプロセスをどのように行うことができますか?@ f1sh – honey1

+0

@ honey1は私の答えをコードで更新しました。 – f1sh

関連する問題