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

Arun Говда:

В Java, что я видел до сих пор является то, что всякий раз, когда мы сгенерирует исключение, мы певд исключение. Как в следующем примере.

try{
    somethingThatCanGoWrong();
}catch(Exception e){
    throw new FailedToDoSomethingException("The other guy failed");
}

Всегда нужно бросить новый экземпляр исключения? Могу ли я сделать это следующим образом?

public class Blah
{
    private static final FailedToDoSomethingException failedToDoSomethingException = new FailedToDoSomethingException(
        "The other guy failed" );

    public static void main( String[] args )
    {
        try {
            somethingThatCanGoWrong();
        } catch ( Exception e ) {
            throw failedToDoSomethingException;
        }
    }
}

Я не предпочитаю последний пример из-за 2 причины.

  1. Объект-восточному говоря, любое исключение не является ни собственностью класса, ни свойство экземпляра.
  2. Сбой треска многопоточной среды, когда сообщение Исключения динамически генерируются и основано на методу аргументе. Ниже приводится пример.

    File getFile(String filePath){

    throw new FileNotFoundException("File at path: "+filePath+" was not found");

    }

Существуют ли какие - либо другие причины , кроме выше 2? Есть что - нибудь , что происходит за кулисами , когда мы создаем новый экземпляр исключения? что - то вроде заполнения контекста исключения (как StackTrace. Но я считаю , что происходит , когда мы используем throwключевое слово)?

Или это просто хорошая практика, чтобы бросить новый Exception все время? (Опять же, почему это хорошая практика?)

Питер Люстиг:

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

Вы можете выполнить этот пример:

public class Foo {

    private static final RuntimeException re = new RuntimeException("MSG");

    public static void main(String[] args) {
        try {
            Integer.parseInt("!!#!");
        } catch (Exception e) {
            throw re;
        }
    }
}

Когда вы посмотрите на StackTrace:

Exception in thread "main" java.lang.RuntimeException: MSG
    at test.Foo.<clinit>(Foo.java:5)

Вы видите, что линия в StackTrace не линия, где вы на самом деле бросить исключение, а линия была вы звоните new

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=8210&siteId=1