Ява. Как разрешить пользователю пропускать запрашиваемое числовое требование, используя ввод строки?

Исходный вопрос

Я создаю программу, чтобы попросить пользователя добавить учеников в класс. У студента должен быть идентификатор и может быть оценка (двойная) и буквенная оценка (строка). В разделе ниже пользователю предлагается ввести оценку двойного типа данных. Я хочу разрешить пользователю пропустить, введя «s» строкового типа данных. Как это сделать, учитывая, что переменная score имеет тип данных double?

        System.out.println("Kindly input Score:    (Enter s to Skip)"); 
        score = input.nextDouble();   

Вывод:
Пожалуйста, введите балл: (Введите s, чтобы пропустить)

Отредактированный вопрос

Теперь, благодаря вашим отзывам, ребята, мне удалось создать строку переменной String, которая считывает пользовательский ввод, затем проверяет, является ли это «S»/«s», и в противном случае анализирует значение как двойное. Теперь, основываясь на вопросе, как я могу пропустить подсказку и перейти к следующей подсказке, если пользователь решит пропустить? Я пытался использовать перерыв; но он выходит из всего цикла. Есть ли способ пропустить вопрос для оценки и перейти к вопросу для буквенной оценки?

// Prompting the user for Score (Numerical Grade)

System.out.println("Kindly input Score:    (Enter s to Skip)"); 
// reading the input into the line variable of string datatype
String line = input.nextLine(); 
// checking if line =="s" or =="S" to skip, otherwise
// the value is parsed into a double
if("s".equals(line) || "S".equals(line))
{
break;  // this exists the loop. How can I just skip this requirement 
        //and go to the next prompt?
}else try
{
       score = Double.parseDouble(line);                
       System.out.println(score);
} catch( NumberFormatException nfe)
{

}
// Prompting the user for Numerical Grade
System.out.println("Kindly input Grade:    (Enter s to Skip)");
String line2 = input.nextLine();
if("s".equals(line2) || "S".equals(line2))
{
       break;  // this exists the loop. How can I just skip this 
       // requirement and go to the next prompt?
}else try
{
     score = Double.parseDouble(line2);
     System.out.println(score);
} catch( NumberFormatException nfe)
{

}

person ab_dev    schedule 24.05.2016    source источник
comment
Используйте nextLine() вместо nextDouble(); проверьте, ввели ли они s, и в противном случае проанализируйте его как двойное.   -  person Andy Turner    schedule 25.05.2016
comment
поэтому тип данных счета должен оставаться двойным?   -  person ab_dev    schedule 25.05.2016
comment
Да. Но вы назначаете nextLine() временной строке.   -  person Andy Turner    schedule 25.05.2016
comment
Потрясающий. Это было очень полезно.   -  person ab_dev    schedule 25.05.2016
comment
комментарий не по теме: ставить открывающую фигурную скобку в конце той же строки вместо новой строки; это конвенция   -  person OscarRyz    schedule 25.05.2016
comment
Также вы всегда можете задать новый вопрос, они бесплатны :)   -  person OscarRyz    schedule 25.05.2016


Ответы (2)


Проверьте, ввел ли пользователь «s». Если это так, пропустите его, иначе проанализируйте двойной:

double score;
String line = input.nextLine();
if ( "s".equals(line) ) {
   // skip
} else try {
   score  = Double.parse(line);
} catch ( NumberFormatException nfe ) { 
  // it wasn't a valid double... handle here
}

Чтобы перейти к следующему приглашению, просто измените логику, вместо того, чтобы проверять, является ли строка «s», проверьте, является ли не «s», чтобы прочитать значение

// psuedo code
while( true ) {
    line = "enter score or s to skip".prompt()

    if (!"s".equals(line)) { // it wasn't s, read it
       score = Double.parseDouble(line)
    } else {
       ... skip or assign a default
       score = 0.0d;
    }

    line = "enter grade or s to skip".prompt()
    if ( !"s".equals(line) ) { it wasn't s, then read
      grade = line;
    } else { 
       .. skip or put default
      grade = "A"
    }

}

person OscarRyz    schedule 24.05.2016
comment
Это очень полезно! - person ab_dev; 25.05.2016
comment
Мне удалось создать строку переменной String, которая считывает пользовательский ввод, затем проверяет, является ли он S/s, и в противном случае анализирует значение как двойное. Теперь, основываясь на вопросе, как я могу пропустить подсказку и перейти к следующей подсказке, если пользователь решит пропустить? Я пытался использовать перерыв; но он выходит из всего цикла. Есть ли способ пропустить вопрос для оценки и перейти к вопросу для буквенной оценки? (пожалуйста, проверьте отредактированный вопрос) - person ab_dev; 25.05.2016

Вы не можете прочитать строку, используя метод nextDouble().

Вместо этого вы можете прочитать строку и попытаться разобрать ее как двойную:

String line = input.nextLine();

if(line.equals("s")) {
    // skip the line
} else {
    try {
        double grade = Double.parseDouble(line);

        // nice, it was a double... we can work with the grade now

    } catch(NumberFormatException e) {
        // neither an "s", nor a properly formatted double.
        // Time for error handling.
    }
}

Для получения дополнительной информации см. JavaDoc для Double.parseDouble().

Редактировать: сначала проверьте "s", а затем проанализируйте двойное значение. Спасибо за подсказку @AndyTurner.

person TimoStaudinger    schedule 24.05.2016
comment
Это было очень полезно ... поэтому я попробовал приведенный ниже код, но получаю эту ошибку: двойное число не может быть преобразовано в строку. System.out.println(Пожалуйста, введите Score: (Введите s, чтобы пропустить)); Строка line = input.nextLine(); if(строка == s || строка == S) { break; } еще { класс = Double.parseDouble (строка); } - person ab_dev; 25.05.2016
comment
Пожалуйста, отредактируйте свой код в своем вопросе. Очень тяжело читать комментарий. - person TimoStaudinger; 25.05.2016
comment
Кроме того, никогда не сравнивайте две строки, используя ==, всегда используйте equals(). - person TimoStaudinger; 25.05.2016
comment
Исключения @TimoSta предназначены для обработки исключительных условий. Их не следует использовать для вещей, которые пользователь должен вводить правильно: сначала проверьте, является ли это s, а затем проанализируйте его, если нет. - person Andy Turner; 25.05.2016
comment
Теперь, благодаря вашим отзывам, ребята, мне удалось создать строку переменной String, которая считывает пользовательский ввод, затем проверяет, является ли это S/s, и в противном случае анализирует значение как двойное. Теперь, основываясь на вопросе, как я могу пропустить подсказку и перейти к следующей подсказке, если пользователь решит пропустить? Я пытался использовать перерыв; но он выходит из всего цикла. Есть ли способ пропустить вопрос для оценки и перейти к вопросу для буквенной оценки? (пожалуйста, проверьте отредактированный вопрос) - person ab_dev; 25.05.2016
comment
@AndyTurner Согласен, сначала нужно проверить строку на s. Но опять же, на мой взгляд, даже пользовательский ввод строки, не равной s и не поддающейся анализу на двойное значение, не обязательно оправдывает работу с ней с использованием исключения. Тот факт, что работа с NumberFormatException является единственным практическим способом проверки правильно отформатированного двойного значения, вызывает сожаление. - person TimoStaudinger; 25.05.2016
comment
@TimoSta, но дело в том, что если пользователь вводит правильный ввод, исключения не должно быть, потому что это не исключительный случай по определению. - person Andy Turner; 25.05.2016