Обучение Try-Catch - PullRequest
3 голосов
/ 08 мая 2009

Я новичок в Java, поэтому, пожалуйста, потерпите меня

static int load = 100;
static int greet;

public void loadDeduct(int cLoad, int c){
    int balance;
    balance = cLoad - 7;
    System.out.println("Your balance: " + balance);
}

public void loadDeduct(int tLoad){
    int balance;
    balance = tLoad - 1;
    System.out.println("Your balance is: " + balance);
}

public static void main (String [] args){
    int choice;
    Scanner scan = new Scanner(System.in);

    System.out.println("I'm a cellphone, what do you want to do?");
    System.out.println("Press 1 to send SMS / Press 2 to Call");

    choice = scan.nextInt();

    CellphoneLoad N95 = new CellphoneLoad();

    if (choice == 1){
        N95.loadDeduct(load);
    }else if (choice == 2){
        N95.loadDeduct(load, greet);
    }else{
        System.out.println("Invalid Option!!!");
    }

Как мне реализовать обработку исключений в этой программе? Я не совсем уверен, как использовать блок catch, поскольку нас еще не учили обо всем, что касается исключений. Это было просто упражнение, которое нас попросили сделать. Я хочу заменить операторы if else на блоки try-catch ... это возможно?

Ответы [ 7 ]

2 голосов
/ 08 мая 2009

Один важный принцип, который следует учитывать в Java, - это два типа: 1. Время выполнения 2. Типизированный / явный (из-за отсутствия лучшего слова)

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

Типизированные / явные исключения оформляются в вызовах методов и должны быть там, чтобы вызывающий мог предпринять некоторые действия с ними.

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

И, как отметил Патрик, вы обычно не хотите использовать исключения для управления потоком.

1 голос
/ 08 мая 2009

Добавление исключений в этот фрагмент кода не добавляет особой ценности. То, о чем я могу думать, примерно так:

public static void main (String [] args){

.....

try{
 handleUserChoice(choice);//new method
}
catch(InvalidChoiceException e){
 System.out.println("Invalid Option!!!");
}
}
1 голос
/ 08 мая 2009

Метод Scanner.nextInt() может выдавать несколько исключений. На связанной странице Спецификаций API перечислены три исключения, которые могут быть выброшены.

Например, если введено нецелое значение, например "one" вместо 1, может быть выброшено InputMismatchException.

Как правило, try-catch используется для перехвата исключений, как показано в следующем коде:

try
{
    Integer.parseInt("one");      // Statement that can cause an exception.
}
catch (NumberFormatException e)   // Specify which exception to catch.
{
    // Code to handle the NumberFormatException.
}

Более подробную информацию об исключениях можно найти в Уроки: Исключения из Учебные руководства по Java . В частности, может быть полезен раздел Исключения отлова и обработки .

1 голос
/ 08 мая 2009

Единственная часть вашего кода, которая может вызвать исключение, - это вызов:

scan.nextInt();

Согласно JavaDocs, это может выдать следующие возможные исключения:

  • InputMismatchException (если следующий токен не соответствует целому регулярное выражение или вне диапазон)
  • NoSuchElementException (если вход исчерпан)
  • IllegalStateException (если это сканер закрыт) * ​​1011 *

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

try {
    choice = scan.nextInt();
} 
catch (InputMismatchException e) {
  System.out.println(e.getMessage());
}
catch (NoSuchElementException e) {
  System.out.println(e.getMessage());
}
catch (IllegalStateException e) {
  System.out.println(e.getMessage());
}

Как правило, вы хотите, чтобы ваши блоки "улова" начинались специфично или, скорее всего, имели бы менее вероятный / более общий характер.

Вы можете дополнительно «выбросить» исключения, чтобы любой метод, в котором происходит исключение, не обрабатывал его - метод, вызвавший этот вызывающий исключение метод, должен был бы обрабатывать его (или вызывать его снова и т. Д., Пока он не будет обработан). попадает в среду выполнения Java).

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

switch (choice) {
    case 1:  N95.loadDeduct(load);
             break;
    case 2:  N95.loadDeduct(load, greet);
             break;
    default: System.out.println("Invalid Option!!!");
}
1 голос
/ 08 мая 2009

Не идеально использовать исключения для управления потоком. Из вашего кода не ясно, какие исключения могут быть выброшены. Может быть, вы можете уточнить немного больше.

0 голосов
/ 08 мая 2009

Я не вижу причин использовать исключения вместо блока if-else. Вы можете попробовать использовать оператор switch, это выглядело бы лучше.

вы должны использовать исключения для обработки ошибок, которые могут возникнуть внутри методов loadDeduct. затем вы должны заключить строки, вызывающие N95.loadDeduct, в блок try-catch, чтобы написать, что произойдет, если loadDeduct не работает

0 голосов
/ 08 мая 2009

Это действительно довольно просто. Сначала определите, где вы хотите получить исключение. Там может быть, кроме как выброшенный код библиотеки или вы можете бросить свой собственный. Затем используйте попытку .. поймать, чтобы справиться с этим. Вот простой пример "привет, мир":

public class TryTry {

    public void doIt() throws Exception {
       System.err.println("In the doIt method.");
       throw new Exception("Hello there!");
    }

    public static void main(String[] argv){
       TryTry t = new TryTry();
       // here we'll catch it.
       try {
           System.err.println("About to call doIt().");
          t.doIt();
       } catch (Exception e) {  // e now has your exception object
          System.err.println("In the exception handler.");
          System.err.println("Exception says: "+ e);
       }
    }
}

Эффект броска состоит в том, чтобы создать этот объект исключения и отправить его в стек, пока он не будет пойман. Чтобы поймать это, вы окружаете код, который может выбросить его, с помощью tr { ... }, и обрабатываете исключение с помощью catch.

Вот результаты:


javac TryTry.java && java TryTry
About to call doIt().
In the doIt method.
In the exception handler.
Exception says: java.lang.Exception: Hello there!
...