2014-07-07 2 views
0

State이 입력 될 때까지 루프는 동일한 레코드에 "있어야"합니다. 유효한 옵션은 경고로 기록됩니다 : [undefined, x, o, c, a, l, d]하지만 분명히 루프는 다음 레코드로 계속 진행됩니다.유효한 데이터가 입력 될 때까지 무한 루프를 입력하는 방법은 무엇입니까?

은 유효한 입력이 수신 될 때까지 "무한 루프"여야합니다.

[email protected]:~$ 
[email protected]:~$ 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:^[email protected]:~$ 
[email protected]:~$ 

코드 : 나는 루프 밖으로 일했다,하지만 불행히도, 문제가 무엇인지 볼 수 있다고 생각

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; 
    } 

} 

.

+3

는 당신이 우리를 보여줄 수있는 방법을 방법'State.valueOf (newState)'작품! – Baalthasarr

+0

디버깅을 시도하고 'newState'가 올바르게 설정되어 있는지 확인 했습니까? – Jonny

+0

네, 저는 그것이 State.valueOf()라고 생각합니다. 나는 갱신 할 것이다. – Thufir

답변

2
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);에 그것은 'undifined'되지 않은 상태를 가지고 다음과 같이 당신은 시도 할 수 있습니다. 이제 상태를 정의되지 않은 상태와 비교하면 항상 false가됩니다. 그래서 내부 while 루프가 끝납니다.

yure 변수 상태 또는 true로 설정된 부울을 사용하고 입력이 올바른 경우 false로 설정되므로 inner while 루프에서 벗어납니다. 난 당신이 State.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 (state == State.undefined); 

편집 :

이 시도 루프는 한 라운드 후에 끝납니다.

0

복잡한 시나리오는 아닙니다.

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

그는 이것을'do {[..]} while() 루프로 시도하지만 그에게는 효과가 없다. – Baalthasarr

0

시행 착오 솔루션 : 나는 그것을 부러 상상할 수는 없지만 내 기억으로

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); 
     } 
    } 
} 

이 becuase, 그 전에 제대로 반복했다.

출력 :

[email protected]:~$ 
[email protected]:~$ 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 
[email protected]:~$ 
+0

내 대답을 보라. 나는 지금 오류를 발견했다. 그것은 당신의 while 루프 상태였습니다. – Baalthasarr

관련 문제