java debug模式能正常运行_java – 正常运行时代码不工作,但在debug(eclipse)中工作...

我对此感到困惑:当我在

eclipse中正常运行我的程序时,我的一些代码无法正常工作,但是当我使用调试模式单独运行每个步骤时,它确实发生了故障.

码:

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块中,然后它工作.为什么它会起作用而不是其他?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值