gpt4 book ai didi

java - 代码在正常运行时不工作,但在调试时工作(eclipse)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:43 24 4
gpt4 key购买 nike

我对此感到非常困惑:当我在 eclipse 中正常运行我的程序时,我的某些代码无法正常工作,但当我使用 Debug模式分别运行每个步骤时,它确实有效。

代码:

public void showConnectDialog() {
ConnectDialog connectDialog = new ConnectDialog();
connectDialog.setVisible(true);
//Until here, code runs
while(! connectDialog.getConnected()) {};
//The next line does only run in debug
JOptionPane.showMessageDialog(connectDialog, "Connected", "Connected", JOptionPane.INFORMATION_MESSAGE);

}

连接器(在用户点击对话框中的“连接”后立即启动(作为线程)):

private class ServerConnector implements ActionListener, Runnable {

@Override
public void actionPerformed(ActionEvent e) {
if (! IP_field.getText().equals("")) {
if (! isConnecting) {
new Thread(new ServerConnector(), "ServerConnector").start();

}

}
else {
JOptionPane.showMessageDialog(dialog,
"Enter an IP address",
"Enter IP",
JOptionPane.WARNING_MESSAGE);

}

}

@Override
public void run() {
try {
setConnecting(true);
Socket socket = connect();
if (socket != null) {
ObjectOutputStream oOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream oIn = new ObjectInputStream(socket.getInputStream());
if (login(oOut, oIn)) {
isConnected = true;
setConnecting(false);

}
else {
socket.close();

}

setConnecting(false);

}

}
catch (RSPException e) {
e.printStackTrace();
System.exit(1);

}
catch (Exception e) {
//If an exception occurs, setConnecting() will be true. This
//not good, so it has to be set to false
e.printStackTrace();
setConnecting(false);

}

}

private boolean login(ObjectOutputStream oOut, ObjectInputStream oIn)
throws ClassNotFoundException, IOException, RSPException {
//Send login request action:
oOut.writeObject(new LoginAction(ActionSender.CLIENT, getID(),
getPassword()));

Object obj = oIn.readObject();
if (obj instanceof LoginActionResult) {
LoginActionResult result = (LoginActionResult) obj;
if (result.getResult() == LoginResults.SUCCES) {
return true;

}
else if (result.getResult() == LoginResults.FAIL_ON_ID) {
JOptionPane.showMessageDialog(dialog,
"Invalid password or ID",
"Can't login",
JOptionPane.ERROR_MESSAGE);
return false;

}
else if (result.getResult() == LoginResults.FAIL_ON_PASSWORD) {
JOptionPane.showMessageDialog(dialog,
"Invalid password or ID",
"Can't login",
JOptionPane.ERROR_MESSAGE);
return false;

}
else if (result.getResult() == LoginResults.SERVER_FULL) {
JOptionPane.showMessageDialog(dialog,
"Couldn't connect: \n" +
"Server is full",
"Failed to connect",
JOptionPane.WARNING_MESSAGE);
return false;

}
else {
return false;

}

}
else {
System.out.println(obj);
throw new RSPException("Server is not following the protocol.");

}

}

private void setConnecting(boolean connecting) {
if (connecting) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
connectButton.setEnabled(false);

}
});
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
connectButton.setText("Connecting...");

}
});

}
else {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
connectButton.setText("Connect");

}
});
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
connectButton.setEnabled(true);

}
});

}

isConnecting = connecting;

}

private String getAddressFromTextField() {
return IP_field.getText();

}

private InetAddress getInetAddress(String fullAddress) {
try {
if (fullAddress.contains(":")) {
String[] splitAddress = fullAddress.split(":");
return InetAddress.getByName(splitAddress[0]);

}
else {
return InetAddress.getByName(fullAddress);

}
}
catch (UnknownHostException e) {
return null;

}

}

private int getPort(String fullAddress) {
try {
String[] splittedAddress = fullAddress.split(":");
return Integer.valueOf(splittedAddress[1]);

}
catch (NumberFormatException ex) {
return -1;

}
catch (NullPointerException
| ArrayIndexOutOfBoundsException
| PatternSyntaxException ex) {
//Returning default port value: 25566, because no port was given
return 25566;

}

}

@SuppressWarnings("resource")
private Socket connect() {
Socket socket = null;

InetAddress address = null;
if ((address = getInetAddress(getAddressFromTextField())) == null) {
return null;

}
int port = getPort(getAddressFromTextField());

try {
socket = new Socket(address, port);

}
catch (ConnectException e ) {
Socket retrySocket = null;
if ((retrySocket = retryConnect(address, port)) == null) {
JOptionPane.showMessageDialog(dialog,
"Connection timed out",
"Failed to connect",
JOptionPane.ERROR_MESSAGE);
setConnecting(false);

}
else {
socket = retrySocket;

}

}
catch(IOException e) {
e.printStackTrace();

}

return socket;

}

private Socket retryConnect(InetAddress address, int port) {
Thread waitThread = new Thread(new Runnable() {

@Override
public void run() {
try {
//Will wait 15(000) (milli)seconds before stopping with
//trying to connect.
//One second (1000 millis) is for debugging and testing
Thread.sleep(1000);

}
catch (InterruptedException e) {
e.printStackTrace();

}

}

});

waitThread.start();

while (waitThread.isAlive()) {
try {
return new Socket(address, port);

}
catch (ConnectException e) {
//Do nothing, will re-attempt to connect.

}
catch (IOException e) {
e.printStackTrace();

}

}

return null;

}

private String getID() {
return ID_field.getText();

}

private String getPassword() {
if (getID().equals("master")) {
return "masterPassword";

}
else {
return new String(passwordField.getPassword());

}

}

}

getConnected() 在连接到服务器后立即返回 true。连接器在单独的线程上运行。

编辑:我尝试将代码放入 getConnected() while block 中,然后它就可以工作了。为什么它当时有效而不是其他?

最佳答案

我有同样的问题,但有更多的规范。代码在 32 位中运行良好,但我在 64 位中遇到了这个问题(我使用的是 native 库,所以我需要维护两者)。

我找到的解决方案是在 while 循环中添加 Thread.sleep()。我不知道它为什么会起作用,所以你的猜测和我的一样好。

更好的解决方案可能是实现 Observer Pattern而不是无限循环。但这需要一些重构。

关于java - 代码在正常运行时不工作,但在调试时工作(eclipse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com