2016-03-17 3 views
-2

Я создал конструктор для ввода названия лица, будь то его миссис Миссис Мисс и т. Д. И когда пользователь ввел что-то другое, как «мистер», он повторит и снова попросит название пользователя. Но вот в чем проблема: когда моя программа спросит у пользователя название, и когда вы ввели его правильно, он снова попросит пользователя за титул, даже если я правильно введу название. Например:Первый ввод просто повторяется

Enter your title (Mr,Miss,Ms, Mrs): mr 
Re enter your title (Mr, Miss, Ms, Mrs): 

, но когда вы ввели правильно на втором вводе, он перейдет к следующему вопросу.

здесь программа

public void setoptions(String title1) 
{ 
    String title0 = "Mr"; 
    String title2 = "Mrs"; 
    String title3 = "Ms"; 
    String title4 = "Miss"; 
    String choice; 

    while(!(title0.equalsIgnoreCase(title) || title2.equalsIgnoreCase(title) || title3.equalsIgnoreCase(title) 
      || title4.equalsIgnoreCase(title))) 
    { 
     System.out.println("Re enter your title (Mr, Miss, Ms, Mrs): "); 
     choice=keyboard.nextLine(); 
     title = choice; 
    } 
    title = title1; 


} 

спасибо :)

+2

что 'title1' стоять, и где объявлен' title'? –

+0

Метод сеттера должен * не * запрашивать у пользователя исправление ошибки в переданном параметре. Вызывающий должен сделать это и только вызвать метод с правильным значением. --- Последняя инструкция присваивает параметру 'title1' поле' title'. Код выше, который будет * не * изменять это поведение, поэтому он бессмыслен и просто путает, что цикл предлагает повторно ввести значение, а затем переходит к игнорированию значения, если оно правильно. Вы, вероятно, имели в виду все ссылки на 'title' в цикле, чтобы ссылаться на' title1'. – Andreas

+0

Вместо этого вы не сравниваете свои параметры с 'title1', но' title', что в данный момент, вероятно, равно null. (Я не комментирую здесь проблемы дизайна, которые уже охвачены другими, и вы должны прислушаться к их советам). – Thomas

ответ

2

Ваша проблема заключается в том, что title0.equalsIgnoreCase(title) и т.д., должны быть на самом деле title0.equalsIgnoreCase(title1). В вашем случае я предполагаю, что title имеет значение null, но при запросе ввода вы назначаете ему входное значение, следовательно, он работает во второй раз.

Кроме того, вы можете улучшить свой код, используя набор:

Set<String> possibleTitles = new HashSet<>(); 
possibleTitles.add("mr"); 
possibleTitles.add("mrs"); 
... 

//since the set internally uses equals() we need to store the elements 
//and do the lookups in a common case (elements are put in lower case here, 
//so we do the lookup in the same case) 
if(!possibleTitles.contains(title.toLowerCase()) { 
    //ask for input, note that this should not be inside the setter 
} 
0

Лучшее в моем смысле использовать и метод Enumutility, чтобы сделать его более четким.

enum Titles { 
    MR, MRS, MS, MISS; 

    public static List<String> listValues(){ 
     return Stream.of(Titles.values()) 
        .map(String::valueOf) 
        .collect(Collectors.toList()); 
    } 
} 

И ваш метод

public void setTitle(String title){ 
    while (!Titles.listValues().contains(title.toUpperCase())) { 
     System.out.println("Re enter your title (Mr, Miss, Ms, Mrs): "); 
     title = keyboard.nextLine(); 
    } 
} 
Смежные вопросы