Исключение уже поймали ошибку - PullRequest
2 голосов
/ 11 июля 2010

Вот код:

public class Exc {
int x = 2;
public void throwE(int p) throws Excp, Excp2 { 
    if(x==p) {
        throw new Excp();
    }
    else if(x==(p+2)) {
        throw new Excp2();
    }
  }
}

Вот код обработчика:

public class tdExc {
public static void main(String[] args) {
    Exc testObj = new Exc();
    try {
        testObj.throwE(0);
        System.out.println("This will never be printed, so sad...");
    } catch(Exception Excp) {
        System.out.println("Caught ya!");
    } catch(Exception Excp2) {
        System.out.println("Caught ya! Again!!!!");
    } finally {
        System.out.println("This will always be printed!");
    }
  }
}

Excp и Excp2 оба расширяют Exception и имеют похожий код (ничего).Теперь я получаю ошибку Exception has already been caught error на Excp2, независимо от того, добавляю ли я 2 или 0 для throwE метода.

Ответы [ 4 ]

9 голосов
/ 11 июля 2010

Вы ищете:

try
{ }
catch(Excp excp)
{
   log(excp);
}
catch(Excp2 excp2)
{
   log(excp2);
}
finally
{ }

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

2 голосов
/ 11 июля 2010

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

Например, NumberFormatException является более конкретным, чем Exception, поскольку NumberFormatException будет выдаваться всякий раз, когда вы попытаетесь разобрать строку в число.

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

В вашем случае вы пытаетесь перехватить одно и то же исключение дважды, так как выесть два оператора catch, которые пытаются перехватить одно и то же исключение.

1 голос
/ 11 июля 2010

Java отправляет предложения catch () на основе типов исключения: оба предложения пытаются перехватить исключение типа Exception и присваивают им имена Excp и Excp2:

public class tdExc {
public static void main(String[] args) {
    Exc testObj = new Exc();
    try {
        testObj.throwE(0);
        System.out.println("This will never be printed, so sad...");
    } catch(Exception Excp) {

Разве это не должно быть Excp e?

        System.out.println("Caught ya!");
    } catch(Exception Excp2) {

Разве это не должно быть Excp2 e?

        System.out.println("Caught ya! Again!!!!");
    } finally {
        System.out.println("This will always be printed!");
    }
  }
}

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

public void throwE(boolean p) throws Excp, Excp2 {
    if(p) {
        throw new Excp();
    } else {
        throw new Excp2();
    }
}

Вызовите его с true или false в качестве параметров.

0 голосов
/ 11 июля 2010

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

Пожалуйста, кто-нибудь скажет мне, если это верно для Java:)

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