#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