Обработка исключений;Попробуй поймать - PullRequest
0 голосов
/ 17 октября 2011

Вот мой код:

class FinallyDemo {
    static void myMethod(int n) throws Exception{
        try {
            switch(n) {
                case 1: 
                    System.out.println("1st case");
                    return;
                case 3: 
                    System.out.println("3rd case");
                    throw new RuntimeException("3!");
                case 4: 
                    System.out.println("4th case");
                    throw new Exception("4!");
                case 2: 
                    System.out.println("2nd case");
            }
        catch (RuntimeException e) {
            System.out.print("RuntimeException: ");
            System.out.println(e.getMessage());
        } finally {
            System.out.println("try-block entered.");
        }
    }

    public static void main(String args[]){
        for (int i=1; i<=4; i++) {
            try {
                FinallyDemo.myMethod(i);
            } catch (Exception e){
                System.out.print("Exception caught: ");
                System.out.println(e.getMessage());
            }
            System.out.println();
        }
    }
}

Теперь разве это не работает так:

Если у меня есть метод try и catch в самом методе, тогда мне не нужно писать

method_name(int n) throws Exception

Разве блокировка try-catch в методе, генерирующем исключение, не позволяет написать «throws exception» в методе, генерирующем исключение?

Ответы [ 7 ]

3 голосов
/ 17 октября 2011

В вашем примере, случай 4 выдает исключение, в то время как в перехвате вы просто перехватываете RuntimeException. Так как для Exception нет catch, ваш метод должен объявить, что он генерирует Exception. Если бы вы добавили улов для исключения, вам не пришлось бы бросать исключение. Это будет работать.

static void myMethod(int n) {
    try {
        switch (n) {
            case 1:
                System.out.println("1st case");
                return;
            case 3:
                System.out.println("3rd case");
                throw new RuntimeException("3!");
            case 4:
                System.out.println("4th case");
                throw new Exception("4!");
            case 2:
                System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } 
    finally {
        System.out.println("try-block entered.");
    }
}
1 голос
/ 17 октября 2011

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

В своем коде вы бросаете Exception, но не предоставляете для него блок catch (вы только перехватываете RuntimeException), поэтому вы должны объявить свой метод как бросающий Exception

Вам понадобится:

 ...
 catch (RuntimeException e) {
     System.out.print("RuntimeException: ");
     System.out.println(e.getMessage());
 } catch (Exception e) {
     System.out.print("Exception: ");
     System.out.println(e.getMessage());
 } finally {
 ...
1 голос
/ 17 октября 2011

Вы не нуждаетесь в предложении throws тогда и только тогда, когда выдается тип создаваемого исключения (или если оно расширяется RuntimeException. В вашем случае вы бросаете Exception с оператором throw new Exception("4!");, но вы перехватываете только тип RuntimeException.

Если вы добавите блок перехвата для Exception, вам больше не понадобится предложение throws. Например:

static void myMethod(int n) throws Exception{
    try {
        switch(n) {
        case 1: 
            System.out.println("1st case");
            return;
        case 3: 
            System.out.println("3rd case");
            throw new RuntimeException("3!");
        case 4: 
            System.out.println("4th case");
            throw new Exception("4!");
        case 2: 
            System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch(Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } finally {
        System.out.println("try-block entered.");
    }
}
0 голосов
/ 17 октября 2011

Вы обрабатываете исключение ДВУМЯ способами. Во-первых, если вы расширяете прямой вызов класса Exception, как это было сделано при объявлении метода

method_name(int n) throws Exception

Это означает, что независимо от того, какой тип исключения встречается в методе, он всегда сможет его перехватить, например, если внутри метода возникнет исключение Arithmetic Exception, NullPointerException или ArrayIndexOutOfBoundsException, которое сможет выполнить указанное выше объявление. поймать каждого из них. Из-за этого нет реальной цели размещения блока try catch внутри этого метода, поскольку даже RunTimeException является частью иерархии класса исключений. Поэтому, если я правильно понял ваш вопрос, программа запустится, а затем поймает исключение из блока catch, в случае неудачи оно перехватит его из объявления метода. Надеюсь, что он отвечает на ваш запрос.

0 голосов
/ 17 октября 2011

Поскольку вы добавляете и RuntimeException, и Exception в коммутатор, вам нужно либо перехватить оба, либо метод должен выбросить Exception, чтобы его можно было обработать в методе, вызывающем myMethod

Чтобы поймать обоих, используйте:

catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
}catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
}

Убедитесь, что улов Exception всегда последний, в противном случае он также поймает RuntimeException, так как он распространяется Exception

0 голосов
/ 17 октября 2011

Прямо сейчас есть два типа исключений

  1. Подклассы Исключения.
  2. Подкласс RuntimeException

Подклассы Exception известны как проверенные исключения, и компилятор обеспечивает управление ими в блоке try / catch или с помощью модификатора , генерирует исключение (или подкласс) в методе.

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

Теперь, если вы используете модификатор , выдает Exception (или подкласс) в методе, компилятору потребуется, чтобы вы управляли им с помощью try / catch.

0 голосов
/ 17 октября 2011

Разве блокировка try-catch в методе, генерирующем исключение, не позволяет написать «throws exception» в методе, генерирующем исключение?

Нет, вы всегда можете объявить об исключении, даже если вы этого не сделаете.

Помимо прочего, это полезно, чтобы подклассы могли бросать их (потому что им не разрешено добавлять дополнительные предложения броска). Это также позволяет позже изменить реализацию без изменения интерфейса исключений.

...