2016-11-22 3 views
0

У меня возникли проблемы с добавлением исключения String, чтобы предотвратить сбой моей программы при вводе строки вместо int. Я осмотрелся и попробовал try{}catch{}, но моя программа все равно будет разбиваться на строку. Я ищу, чтобы исправить getInt().Добавление исключения в java-программу

import java.util.*; 
public class Binary{ 

    public static void main(String[]args){ 
    Scanner in = new Scanner(System.in); 
    String a = ""; 
    boolean cont = true; 
    while(cont){ 
     printb(convert(getInt(in, "Enter a number: "))); 
     System.out.println("Do you want to continue (yes or no)?"); 
     a = in.next(); 
     if(a.equals("yes")) 
     cont = true; 
     else{ 
     System.out.println("You answerd no. Have a nice day."); 
     cont = false; 
     } 
    } 


    } 

    public static int getInt(Scanner console, String prompt){ 
    System.out.print(prompt); 
    while(!console.hasNext()){ 
     try{ 
      console.next(); 
      System.out.println("Not an integer, try again."); 
      System.out.print(prompt); 
     } 
     catch(Input MismatchException exception){ 
      System.out.print("Not an integer, try again."); 
      System.out.print(prompt); 
     } 

    } 
    return console.nextInt(); 
    } 

    public static int[] convert(int decimal){ 

    int decimalCopy = decimal; 
    int len = 0; 
    while(decimal != 0){ 
     decimal/=2; 
     len++; 
    } 
    decimal = decimalCopy; 

    int[] b = new int[len]; 
    int index = 0; 
    while(decimal !=0){ 
     if(decimal%2 != 0) 
     b[index] = 1; 
     else{ 
     b[index] = 0; 
     } 
    decimal/=2; 
    index++; 
    } 

    return b; 

    } 

    public static void printb(int[] b){ 
    for(int i = b.length-1; i>=0; i--){ 
     System.out.print(b[i]); 
    } 
    System.out.println(); 
    } 

} 
+1

Где вы положили 'попробовать catch'? – AxelH

+1

Я не думаю, что исключение является подходящим в случае плохого ввода. Возможно, вы ищете нечто вроде [this] (http://stackoverflow.com/a/8392032/770270), чтобы * проверять * ввод, а не бросать исключение для не исключительного поведения. – tnw

+0

Возможный дубликат [Java Try Catch block] (http://stackoverflow.com/questions/35321312/java-try-catch-block) – AxelH

ответ

1

try/catch/finally является способ справиться с этим, но если вы не знакомы с обработкой исключений, это может быть сложно понять, что именно нужно сделайте с ними. И даже если вы поместите их в нужное место, вам нужно иметь дело со строковым вводом, который не был должным образом «очищен», так сказать, так что каскады до места назначения a и заканчиваются программой (так как все, что нет да нет).

Ключ поставить линию (ы), может бросить исключение внутри try блока, то catchException с некоторой обработки ошибок, а затем продолжить то, что должно произойти с finally. (Здесь вы можете опустить finally, но я хотел убедиться, что вы это понимаете, потому что это важно. finally приходит после try/catch, и все в этом блоке кода будет выполнено в любом сценарии (если вы не выйдете из программы преждевременно).)

Это следует сделать это:

while (cont) { 

    // getInt() is the troublemaker, so we try it: 
    // Notice I have changed 'number' to 'integer' here - this improves 
    // UX by prompting the user for the data type the program expects: 

    try { 
    printb(convert(getInt(in, "Enter an integer: "))); 
    } 

    // we catch the Exception and name it. 'e' is a convention but you 
    // could call it something else. Sometimes we will use it for info, 
    // and in this case we don't really need it, but Java expects it 
    // nonetheless. 
    // We do our error handling here: (notice the call to in.next() - 
    // this ensures that the string that was entered gets properly 
    // handled and doesn't cascade down to the assignment of 'a') - if 
    // this confuses you, try it without the in.next() and see what 
    // happens! 

    catch (Exception e) { 
    System.out.println("\nPlease enter an integer.\n"); 
    in.next(); 
    } 

    // Again, in this case, the finally isn't necessary, but it can be 
    // very handy, so I'm using it for illustrative purposes: 

    finally { 
    System.out.println("Do you want to continue (yes or no)?"); 
    a = in.next(); 
    if (a.equals("yes")) { 
     cont = true; 
    } else { 
     System.out.println("You answered no. Have a nice day."); 
     cont = false; 
    } 
    } 
} 
+0

У меня есть другие предложения, которые бы подтянули ваш код, но я не хочу мутить ответ. Если вам интересно, дайте мне знать, я рад, что просмотрю код, но это нужно делать отдельно. –

+0

Да, я обычно не работаю с исключениями, но я могу это понять, я думаю, что это лучшее объяснение, которое я получил для этого до сих пор. Я, вероятно, попробую сделать порграмму, которая, наконец, вступит в игру, чтобы проверить это (ранее использовалось havent). –

+0

Спасибо! Пожалуйста, отметьте это как принятое, если вы считаете, что это лучшее, я бы очень оценил это, потому что я новичок в ответе, и поэтому мне не хватает репутации, чтобы разблокировать некоторые функции сайта. :) –

1
import java.util.*; 
public class Binary{ 

    public static void main(String[]args){ 
    try { 
    Scanner in = new Scanner(System.in); 
    String a = ""; 
    boolean cont = true; 
    while(cont){ 
     printb(convert(getInt(in, "Enter a number: "))); 
     System.out.println("Do you want to continue (yes or no)?"); 
     a = in.next(); 
     if(a.equals("yes")) 
     cont = true; 
     else{ 
     System.out.println("You answerd no. Have a nice day."); 
     cont = false; 
     } } 
    } catch(Exception e) { 
     System.out.println("Invalid input"); 
    } 


    } 

    public static int getInt(Scanner console, String prompt){ 
    System.out.print(prompt); 
    while(!console.hasNext()){ 
     console.next(); 
     System.out.println("Not an integer, try again."); 
     System.out.print(prompt); 
    } 
    return console.nextInt(); 
    } 

    public static int[] convert(int decimal){ 

    int decimalCopy = decimal; 
    int len = 0; 
    while(decimal != 0){ 
     decimal/=2; 
     len++; 
    } 
    decimal = decimalCopy; 

    int[] b = new int[len]; 
    int index = 0; 
    while(decimal !=0){ 
     if(decimal%2 != 0) 
     b[index] = 1; 
     else{ 
     b[index] = 0; 
     } 
    decimal/=2; 
    index++; 
    } 

    return b; 

    } 

    public static void printb(int[] b){ 
    for(int i = b.length-1; i>=0; i--){ 
     System.out.print(b[i]); 
    } 
    System.out.println(); 
    } 

} `enter code here` 
+0

Попробуйте, он должен работать –

+0

да это работает. Я упустил возможность попробовать «try {} catch() {}' в основном методе. –

+0

Я думаю, что это хорошая идея, чтобы избежать генерических сообщений об ошибках, таких как «недопустимый ввод», хороший UX позволяет информировать пользователя о том, что вводит программа, когда они совершают ошибку. –

Смежные вопросы