как ввести бесконечный цикл, пока не будут введены действительные данные?

#java #loops #while-loop #infinite-loop #do-while

#java #циклы #цикл while #бесконечный цикл #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;
    }

}
  

Я думал, что у меня проработан цикл, но, к сожалению, не вижу, в чем проблема.

Комментарии:

1. можете ли вы показать нам, как работает этот метод State.valueOf(newState) ?!

2. Вы пробовали выполнять отладку и проверять, что newState установлено правильно?

3. да, я думаю, что это State.valueOf() то, что я, возможно, нарушил. Я обновлю.

Ответ №1:

 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, и оно имеет состояние, которое не является «неопределенным». Теперь вы сравниваете его с состоянием undefined, и оно всегда будет false . Таким образом, внутренний цикл while заканчивается на этом.

используйте вашу переменную state или логическое значение, для которого задано значение true, и если ввод правильный, ему будет присвоено значение 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 заканчивался после одного раунда.

Ответ №2:

Это не сложный сценарий. вы можете просто попробовать следующее

 boolean status=true; 
while(status){
  if("matching_input".equals(your_input)){
    status=false;
    // now loop will exit
  }
}
  

Комментарии:

1. он пробует это с внутренним циклом `do{[..]}while(), но у него это не работает

Ответ №3:

Решение методом проб и ошибок:

 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();
                    do {
                        try {
                            log.info(title.toString());
                            c.printf("enter the state for record:");
                            stringState = null;
                            state = State.undefined;
                            stringState = c.readLine();
                            state = State.valueOf(stringState);
                            log.warning(state.toString());
                        } catch (java.lang.IllegalArgumentException iae) {
                            log.warning(Arrays.deepToString(State.values()));
                        }
                    } while (state == 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);
        }
    }
}
  

хотя я не могу представить, что его нарушило, потому что, насколько я помню, раньше оно выполнялось правильно.

вывод:

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

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

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

id  1
phone   456465
title   record number 1
state   undefined
enter the state for record:a
Jul 07, 2014 5:41:38 AM net.bounceme.dur.client.driver.Client inputOutput
WARNING: a
Jul 07, 2014 5:41:38 AM net.bounceme.dur.client.driver.Client inputOutput
INFO: 

id  2
phone   123
title   second record
state   o
enter the state for record:fjklds
Jul 07, 2014 5:41:42 AM net.bounceme.dur.client.driver.Client inputOutput
WARNING: [undefined, x, o, c, a, l, d]
Jul 07, 2014 5:41:42 AM net.bounceme.dur.client.driver.Client inputOutput
INFO: 

id  2
phone   123
title   second record
state   o
enter the state for record:c
Jul 07, 2014 5:41:46 AM net.bounceme.dur.client.driver.Client inputOutput
WARNING: c
Jul 07, 2014 5:41:46 AM net.bounceme.dur.client.driver.Client inputOutput
INFO: 

id  3
phone   14564654
title   etc
state   x
enter the state for record:^C
thufir@dur:~$ 
  

Комментарии:

1. посмотрите на мой ответ, я только что обнаружил ошибку. это было в вашем состоянии вашего цикла while