【问题标题】:Java: Simple If Statement not executingJava:简单的 If 语句未执行
【发布时间】:2014-07-20 12:31:45
【问题描述】:

好的,这让我很生气了好几个小时。我不明白为什么这个 if 语句没有执行。这是我的完整代码。有2个类,'Client'是主类,另一个是连接器类。

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 语句在“客户端”类中。连接器类只是为了让您知道它不会引起问题。

【问题讨论】:

  • 为什么是静态的?静态不起作用。
  • 我建议您对变量名称使用 Java 命名约定。
  • 我猜这里有竞争条件?也许ConnectionSuccess 永远不会设置为true?另外,试试调试程序,看看执行过程中ConnectionSuccess的值是什么..
  • 尽量扔掉与问题无关的代码。然后我们将处于更好的位置来帮助您,也许您自己已经在这样做时发现了问题。代码太多了。
  • 是的,我同意,java 命名约定是:变量以小写字母开头,类以大写字母开头。注意 stackoverflow 是如何突出显示你的变量名的,它认为它们是类型,因为它们是大写的

标签: java mysql concurrency


【解决方案1】:

connectionSuccess 设为volatile 或更改为AtomicBoolean(并标记为final)。问题是您将变量设置在一个Thread 中,但从另一个读取它。

【讨论】:

  • volatile 有什么作用?什么是 AtomicBoolean?
  • @Talha Tanveer volatile 防止为线程缓存变量。vm为了优化代码做什么
  • @TalhaTanveer 听起来您需要在尝试使用并发应用程序之前对 Java 中的并发编程进行一些研究。我强烈建议 Java Concurrency in Practice。 jcip.net.s3-website-us-east-1.amazonaws.com
  • 客户端代码现在正在运行一个无限循环的检查,以将另一个布尔值变为真。请改用 Lock 左右,这样它就可以等待这种情况发生而不消耗资源。
【解决方案2】:
        if(result.next()){
            result.next();

没有意义。当您在这里调用 result.next() 两次时,您正在丢弃第一个结果。

【讨论】:

  • 我知道,我想忽略第一行。但这不是主要问题,我什至添加了 System Print 语句但没有打印出任何内容
  • 好的,但很奇怪。但是您可能还想在对 next() 的第二次调用中添加一个 if 以防万一结果只包含一行:}
【解决方案3】:

对于您的例外情况,我建议使用

 e.printStackTace()

在某些事情破坏您的程序的情况下。

现在如果你执行

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

它会丢弃您的第一个结果并显示您的第二个结果。我建议你使用

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

    //...your code

随意滚动浏览您的记录

【讨论】:

  • 这真的不是我的问题:P 阅读下面的第二个答案,另一个人已经说过了。我做了一些改变。只打印出“e”有什么问题?
  • @TalhaTanveer 您的一些异常未处理。添加它以进行调试。
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多