2014-07-20 97 views
0

好的,所以這已經讓我很煩了幾個小時。我不明白爲什麼不是這個if語句沒有執行。這是我的完整代碼。有兩類,'客戶'是主類,另一類是連接器類。Java:Simple If語句沒有執行

package com.app.client; 

import java.net.ServerSocket; 
import java.sql.SQLException; 

public class Client{ 

    private int IntervalForDatabase=60000; 
    private int IntervalForIPCheck=180000; 
    private boolean AppRunning=true; 
    public boolean ConnectionSuccess=false; 
    private Connector ConnectionTools = new Connector(); 

    public static void main(String args[]){ 
     Thread thread = new Thread(new Runnable(){ 
      public void run(){ 
       Client client = new Client(); 
      } 
     }); 
     thread.start(); 
    } 

    Client(){ 
     /* Check For Current Instance Of Program */ 
     try{ 
      ServerSocket ApplicationSocket = new ServerSocket(6251); 
     }catch(Exception e){ 
      System.exit(0); 
     } 

     Thread Network = new Thread(new Runnable(){ 
      public void run(){ 
       while(!ConnectionSuccess){ 
        try{ 
         ConnectionTools.ConnectToDatabaseServer(); 
         ConnectionSuccess=true; 
         System.out.println("bein a bit"); 
        }catch(Exception e){ 

        } 
       } 
      } 
     }); 
     Network.start(); 

     Thread LiveConnectionCheck = new Thread(new Runnable(){ 
      public void run(){ 
       while(AppRunning){ 
        if(ConnectionSuccess){ 
        /* THIS IF STATEMENT IS NOT EXECUTING */ 
         try { 
          System.out.println("tester"); 
          Thread.sleep(IntervalForIPCheck); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }   
     }); 

     LiveConnectionCheck.start(); 
    } 
} 

連接器類:

package com.app.client; 

import java.net.Socket; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

public class Connector { 
    public boolean DatabaseConnection=false; 
    Socket ClientSocket; 
    private String DatabaseHost="localhost"; 
    private String DatabaseUsername="root"; 
    private String DatabasePassword = ""; 
    private String DatabaseName = "spyware"; 
    private String TableName="activespywares"; 
    public String CurrentServerIP = ""; 
    private Connection MYSQLConnection = null; 
    public ResultSet result; 

    public void ConnectToDatabaseServer(){ 
     try{ 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      MYSQLConnection = DriverManager.getConnection("jdbc:mysql://"+DatabaseHost+"/"+DatabaseName,DatabaseUsername,DatabasePassword); 
      DatabaseConnection=true;    
      System.out.println("connected"); 
     }catch(Exception e){ 
      System.out.println(e); 
      DatabaseConnection=false; 
      return; 
     } 
    } 

    public String ObtainServerIP() throws SQLException{ 
     String text = "";   
     try{ 
      System.out.println("we've made it till here"); 
      PreparedStatement state = MYSQLConnection.prepareStatement("SELECT * FROM `activespywares`"); 
      result = state.executeQuery(); 
      System.out.println("we've made it till here"); 
      if(result.next()){ 
       result.next(); 
       text = result.getString("InternetProtocol"); 
      } 
      return text; 
     }catch(Exception e){ 
      System.out.println(e); 
      text=e+""; 
     } 
     return text; 
    } 
} 

我檢查的一切。我不知道這裏有什麼問題。 if語句位於「客戶」類中。連接器類只是讓你知道它不會導致問題。

+0

爲什麼靜態?靜態不起作用。 – DaBaws

+2

我建議你爲變量名使用Java命名約定。 – kviiri

+0

我猜這裏有種族情況?也許'''''ConnectionSuccess'''永遠不會設置爲true?另外,請嘗試調試程序,查看執行過程中'''ConnectionSuccess''的值是... – Crembo

回答

3

使connectionSuccess或者volatile或更改爲AtomicBoolean(並標記爲final)。問題在於你正在將變量設置爲一個Thread,但是從另一個讀取它。

+0

完美。非常感謝:)它的工作原理! :D – DaBaws

+0

易變性有什麼作用?什麼是AtomicBoolean? – DaBaws

+1

@Talha Tanveer volatile會阻止線程變量的緩存。其中,爲了優化代碼,需要做一些操作。 –

1
 if(result.next()){ 
      result.next(); 

沒道理。當你在這裏調用result.next()兩次時,你會拋出第一個結果。

+0

我知道,我想忽略第一行。但這不是主要問題,我甚至添加了系統打印語句,但不打印任何東西 – DaBaws

+1

好的但很奇怪。但是,如果結果只包含一行,您可能還想添加一個if以便第二次調用next():} – MTilsted

+0

是的,我會這麼做,謝謝! – DaBaws

1

爲了您的例外,我會建議的

e.printStackTace() 

使用中的東西打破你的程序的情況。如果執行

//...your code 
    if(result.next()){ 
     result.next(); 
    //...your code 

現在

它扔掉你的第一個結果,並提出你與你的第二個結果。我會建議你使用

//...your code 
    while(result.next()){ 

    //...your code 

通過您的記錄滾動,請你

+0

這真的不是我的問題:P閱讀下面的第二個答案,另一個人已經說過。我做了一些改變。打印出「e」有什麼問題? – DaBaws

+1

@TalhaTanveer你的一些異常未處理。將其添加爲調試目的。 –

+0

已確認:)! – DaBaws