java - 如何进入无限循环直到输入有效数据?

标签 java loops while-loop infinite-loop do-while

循环应“停留”在同一记录上,直到输入有效的State。有效选项被记录为警告:[undefined, x, o, c, a, l, d],但显然,循环只是继续到下一条记录。

应该是一个“无限”循环,直到收到有效输入。

thufir@dur:~$ 
thufir@dur:~$ java -jar NetBeansProjects/Client/dist/Client.jar 
Jul 07, 2014 5:23:39 AM net.bounceme.dur.client.driver.Client inputOutput
INFO: 

id  1
phone   456465
title   record number 1
state   x
enter the state for record:fjdkfjd
Jul 07, 2014 5:23:43 AM net.bounceme.dur.client.driver.Client inputOutput
WARNING: [undefined, x, o, c, a, l, d]
Jul 07, 2014 5:23:43 AM net.bounceme.dur.client.driver.Client inputOutput
INFO: 

id  2
phone   123
title   second record
state   o
enter the state for record:^Cthufir@dur:~$ 
thufir@dur:~$ 

代码:

package net.bounceme.dur.client.driver;

import net.bounceme.dur.data.Title;
import java.net.*;
import java.io.*;
import java.util.Arrays;
import java.util.logging.Logger;
import net.bounceme.dur.data.State;

public class Client {

    private static final Logger log = Logger.getLogger(Client.class.getName());
    private String server = "localhost";
    private int portNumber = 8080;
    private final Console c = System.console();

    private Client() {
    }

    public Client(String server, int portNumber) {
        this.server = server;
        this.portNumber = portNumber;
    }

    public void inputOutput() throws IOException, ClassNotFoundException {
        Socket socket = new Socket(server, portNumber);
        boolean eof = false;
        Title title = null;
        String stringState = null;
        State state = State.undefined;
        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
            do {
                try {
                    title = (Title) objectInputStream.readObject();
                    log.info(title.toString());
                    do {
                        c.printf("enter the state for record:");
                        stringState = null;
                        state = State.undefined;
                        try {
                            stringState = c.readLine();
                            state = State.valueOf(stringState);
                        } catch (java.lang.IllegalArgumentException iae) {
                            log.warning(Arrays.deepToString(State.values()));
                        }
                    } while (title.getState() == State.undefined);
                    title.setState(state);
                    log.fine(title.toString());

                    title.setTitle("modified from client");
                    objectOutputStream.writeObject(title);
                } catch (java.io.EOFException eofe) {
                    eof = true;
                }
            } while (!eof);
        }
    }
}


package net.bounceme.dur.data;

public enum State {

    undefined(0), x(1), o(2), c(3), a(4), l(5), d(6);
    private int code = 0;

    State(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }

    public static State getState(int i) {
        for (State state : State.values()) {
            if (state.getCode() == i) {
                return state;
            }
        }
        return undefined;
    }

}

我以为我已经解决了循环问题,但不幸的是,我看不出问题所在。

最佳答案

do {
  c.printf("enter the state for record:");
  stringState = null;
  state = State.undefined;
  try {
    stringState = c.readLine();
    state = State.valueOf(stringState);
  } catch (java.lang.IllegalArgumentException iae) {
    log.warning(Arrays.deepToString(State.values()));
  }
} while (title.getState() == State.undefined);

问题出在 while (title.getState() == State.undefined); 你永远不会改变 title 的状态,并且它的状态不是“未定义”。现在你将它与未定义的状态进行比较,结果总是错误的。所以内部 while 循环到此结束。

使用yure变量状态或设置为true的 boolean 值,如果输入正确,它将设置为false,这样你就可以退出内部while循环。

试试这个:

 do {
  c.printf("enter the state for record:");
  stringState = null;
  state = State.undefined;
  try {
    stringState = c.readLine();
    state = State.valueOf(stringState);
  } catch (java.lang.IllegalArgumentException iae) {
    log.warning(Arrays.deepToString(State.values()));
  }
} while (state == State.undefined);

编辑: 就像我现在看到的那样,您之前的代码是正确的,因为您将状态与 State.undefined 进行了比较,但随后您更改了它,以便 while 循环在一轮后结束。

关于java - 如何进入无限循环直到输入有效数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24610645/

相关文章:

java - 打开文件选择器对话框

java - 在 wicket 中自定义 IndicatingAjaxLink

javascript - JQuery 等待 Ajax 响应

javascript - 在测验反馈的 javascript 循环中返回多个反馈实例

c++ - 检查数组元素中的所有数字是否为0或1 [c++]

java - 如何在java构造函数中创建一个空数组

loops - 我怎样才能 "while loop"一个 Axios GET 调用直到满足条件?

Java For 循环 vs While 循环,奇怪的行为和时间性能

c - 如何根据用户输入退出 while(1)?

java - 由于线程交换而滞后