Преобразование входных данных от пользователя в числовое (целое) значение. - PullRequest
0 голосов
/ 29 июля 2011

Я пробовал разные методы для преобразования ввода строки пользователя в целое число, которое я мог сравнить и построить оператор "если-тогда". Каждый раз, когда я пытался его протестировать, это просто исключение. Может кто-нибудь взглянуть на мой Java-код и помочь мне найти путь? Я понятия не имею об этом (также нуб в программировании). Если я нарушаю какие-либо правила, пожалуйста, дайте мне знать, что я новичок здесь. Спасибо.

В любом случае, вот код:

 System.out.println("Sorry couldn't find your user profile " + userName + ".");
 System.out.println("Would you like to create a new user profile now? (Enter Y for yes), (Enter N for no and exit).");
 try {
     BufferedReader answer = new BufferedReader(new InputStreamReader(System.in));
     String addNewUser = answer.readLine();
     Character i = new Character(addNewUser.charAt(0));
     String s = i.toString();
     int answerInDecimal = Integer.parseInt(s);
     System.out.println(answerInDecimal);
 }
 catch(Exception e) {
     System.out.println("You've mistyped the answer.");
 e.getMessage();
 }

Ответы [ 5 ]

1 голос
/ 29 июля 2011

Похоже, вы пытаетесь преобразовать строку (которая должна быть одним символом, Y или N) в ее символьное значение, а затем получить числовое представление символа.

Если вы хотите превратить Y или N в их десятичное представление, вы должны выполнить приведение к int:

BufferedReader answer = new BufferedReader(new InputStreamReader(System.in));
String addNewUser = answer.readLine();
char i = addNewUser.charAt(0);
int integerChar = (int) i;       //The important part
System.out.println(integerChar);

Возвращает целочисленное представление символа, введенного пользователем. Также может быть полезно вызвать метод String.toUpperCase (), чтобы гарантировать, что разные входы Y / N или y / n не дают разных значений.

Однако вы также можете сделать if-else, основываясь на самом символе, а не конвертировать его в целое число.

BufferedReader answer = new BufferedReader(new InputStreamReader(System.in));
String addNewUser = answer.readLine();
char i = addNewUser.toUpperCase().charAt(0);
if (i == 'Y') {
    //Handle yes
} else if (i == 'N') {
    //Handle no
} else {
    System.out.println("You've mistyped the answer.");
}
1 голос
/ 29 июля 2011

Я думаю, что вы хотели попросить их Введите 0 для да и 1 для нет ?Может быть?

Вы просите пользователя ввести Y или N, а затем вы пытаетесь разобрать это в целое число.Это всегда вызывает исключение.

РЕДАКТИРОВАТЬ - Как уже отмечали другие, если вы хотите продолжать использовать Y или N, вы должны сделать что-то вроде

String addNewUser = answer.readLine();
if ( addNewUser.toLowerCase().startsWith("y") ) {
// Create new profile
}
0 голосов
/ 03 апреля 2012

Нельзя преобразовать String в int, если только вы не знаете, что String содержит действительное целое число.

Во-первых , лучше использовать класс Scanner для ввода, поскольку он быстрее и вам не нужно вмешиваться в использование потоков, если вы новичок Вот как Scanner будет использоваться для ввода:

import java.util.Scanner; // this is where the Scanner class resides

...

Scanner sc = new Scanner(System.in); // "System.in" is the stream, you could also pass a String, or a File object to take input from
System.out.println("Would you like to ... Enter 'Y' or 'N':");
String input = sc.next();
input = input.toUpperCase();
char choice = sc.charAt(0);
if(choice == 'Y') 
{ } // do something

else if(choice == 'N')
{ } // do something

else
System.err.println("Wrong choice!");

Этот код также может быть сокращен до одной строки (однако вы не будете возможность проверить третье условие «неправильный выбор»):

if ( new Scanner(System.in).next().toUpperCase().charAt(0) == 'Y')
      { } // do something
   else  // for 'N'
      { } // do something

Во-вторых , char в int преобразование просто требует явного типа литье:

   char ch = 'A';
   int i = (int)ch;  // explicit type casting, 'i' is now 65 (ascii code of 'A')

В-третьих , даже если вы берете ввод из буферизованного потока ввода, вы примет ввод в String. Таким образом, извлечение первого персонажа из и проверка строки просто требует вызова charAt() функция с 0 в качестве параметра. Возвращает символ, который может затем сравните его с одним символом в одинарных кавычках:

   String s = in.readLine();
   if(s.charAt(0) == 'Y') { } // do something

В-четвертых , очень плохая идея поместить всю программу в try блок и catch Exception в конце. IOException может быть выдается функцией readline(), а parseInt() может выдать NumberFormatException, так что вы не сможете справиться с 2 исключения отдельно. В этом вопросе код достаточно мал для это следует игнорировать, но на практике будет много функций который может генерировать исключения, поэтому становится легко потерять отслеживание того, какая именно функция вызвала, какое исключение, и надлежащая обработка исключений становится довольно сложной.

0 голосов
/ 29 июля 2011

parseInt только для преобразования текстовых чисел в целые числа: все остальное получает исключение NumberFormatException.

Если вам нужно десятичное значение ASCII символа, просто приведите его к целому числу.

0 голосов
/ 29 июля 2011

Используйте if (addNewUser.startsWith("Y") || addNewUser.startsWith("y")) { вместо.Или (как указал Марк) if (addNewUser.toLowerCase().startsWith("y")) {.Кстати, возможно, посмотрите на Apache Commons CLI ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...