Java:简单If语句不执行
好吧,这让我恼火了好几个小时。我不明白为什么这个if语句不能执行。这是我的完整代码。有两个类,“客户端”是主类,另一个是连接器类Java:简单If语句不执行,java,mysql,concurrency,Java,Mysql,Concurrency,好吧,这让我恼火了好几个小时。我不明白为什么这个if语句不能执行。这是我的完整代码。有两个类,“客户端”是主类,另一个是连接器类 package com.app.client; import java.net.ServerSocket; import java.sql.SQLException; public class Client{ private int IntervalForDatabase=60000; private int IntervalForIPCheck
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语句位于“Client”类中。连接器类只是让您知道它不会引起问题
if(result.next()){
result.next();
没道理。在这里两次调用result.next()时,您正在丢弃第一个结果
没道理。在这里两次调用result.next()时,您将丢弃第一个结果。使
连接成功或者将volatile
更改为原子布尔值(并标记为final
)。问题是您在一个线程中设置变量,但从另一个线程读取变量 使连接成功
或易失性
或更改为原子布尔值
(并标记为最终
)。问题是您在一个线程中设置变量,但从另一个线程读取变量 对于您的例外情况,我建议使用
e.printStackTace()
万一有什么东西破坏了你的程序
现在如果你执行
//...your code
if(result.next()){
result.next();
//...your code
它会丢弃你的第一个结果,并呈现给你第二个结果。我建议你使用
//...your code
while(result.next()){
//...your code
若要根据需要滚动查看记录,请使用
e.printStackTace()
万一有什么东西破坏了你的程序
现在如果你执行
//...your code
if(result.next()){
result.next();
//...your code
它会丢弃你的第一个结果,并呈现给你第二个结果。我建议你使用
//...your code
while(result.next()){
//...your code
您可以随意滚动记录为什么是静态的?。静态不起作用。我建议您对变量名使用Java命名约定。我猜这里有竞争条件?可能ConnectionSuccess
从未设置为true?另外,试着调试程序,看看执行期间ConnectionSuccess
的值是多少。试着扔掉与问题无关的代码。然后,我们将处于一个更好的位置来帮助你,也许你自己在这样做的时候已经发现了问题。这是太多的代码了。是的,我同意,java命名约定是:变量以小写字母开始,类以大写字母开始。注意stackoverflow是如何突出显示变量名的,它认为它们是类型,因为它们的大写字母是HY static?。静态不起作用。我建议您对变量名使用Java命名约定。我猜这里有竞争条件?可能ConnectionSuccess
从未设置为true?另外,试着调试程序,看看执行期间ConnectionSuccess
的值是多少。试着扔掉与问题无关的代码。然后,我们将处于一个更好的位置来帮助你,也许你自己在这样做的时候已经发现了问题。这是太多的代码了。是的,我同意,java命名约定是:变量以小写字母开始,类以大写字母开始。注意stackoverflow是如何突出显示变量名的,它认为它们是类型,因为它们是大写的。我想忽略第一行。但这不是主要的问题,我甚至添加了一个系统打印语句,但没有打印出任何正确但奇怪的东西。但是您可能还希望在对next()的第二个调用中添加if,以防结果只包含一行:}我知道,我想忽略第一行。但这不是主要的问题,我甚至添加了一个系统打印语句,但没有打印出任何正确但奇怪的东西。但是您可能还希望在对next()的第二次调用中添加if,以防结果只包含一行:}volatile做什么?什么是原子布尔数?@Talha Tanveer volatile防止缓存线程的变量。哪个vm可以优化code@TalhaTanveer听起来,在尝试使用并发应用程序之前,您需要对java中的并发编程进行一些研究。我强烈建议在实践中使用Java并发。客户机代码现在正在运行一个无限循环,检查另一个是否将布尔值转换为true。使用一个锁,这样它就可以在不消耗资源的情况下等待这种情况发生。volatile做什么?什么是原子布尔数?@Talha Tanveer volatile防止缓存线程的变量。哪个vm可以优化code@TalhaTanveer听起来,在尝试使用并发应用程序之前,您需要对java中的并发编程进行一些研究。我强烈建议在实践中使用Java并发。客户机代码现在正在运行一个无限循环,检查另一个是否将布尔值转换为true。使用一个锁,这样它就可以在不消耗资源的情况下等待这种情况的发生。这真的不是我的问题:阅读下面的第二个答案,另一个人已经说过了。我做了一些改变。打印出“e”有什么问题?@TalhaTanveer您的一些异常没有得到处理。添加它是为了调试。这真的不是我的问题:阅读下面的第二个答案,另一个人已经说过了。我做了一些改变。打印出“e”有什么问题?@TalhaTanveer您的一些异常没有得到处理。添加它以进行调试。