Распространенные исключения должны быть пойманы в Java? - PullRequest
0 голосов
/ 05 октября 2011

Если я распространяю исключение, должен ли я в конечном итоге поймать его позже?

Предположим, у меня есть этот код:

public class InvalidDataException extends Exception  {
    public InvalidDataException (String e){
        super(e);
    }    
}

public class Vehicle {

    private double speed;
    private int vin;

    public Vehicle (double nspeed, int nvin) throws InvalidDataException{
        setVin(nvin);
        setSpeed(nspeed);
    } 
    public double getSpeed() {
        return speed;
    }
    public void setSpeed(double speed) throws InvalidDataException{
        if (speed < 1){
            throw new InvalidDataException("negative speed: " + speed);
        }
        this.speed = speed;
    }
    public int getVin(){
        return vin;
    }
    public void setVin(int speed){
        this.vin = speed;
    }  
}

это нормально, или мне нужно его перехватить?вместо этого?

Ответы [ 4 ]

2 голосов
/ 05 октября 2011

Проверенное исключение в Java распространяется до тех пор, пока не произойдет одно из следующих событий:

  1. Исключение попадает в блок catch
  2. Достигнут метод main () (если он не обнаружен в этот момент, JVM падает)
  3. Определен необработанный обработчик исключения, который перехватывает исключение (см. http://stuffthathappens.com/blog/2007/10/07/programmers-notebook-uncaught-exception-handlers)

Обратите внимание, что непроверенное исключение (то есть исключение, которое выходит из RuntimeException) также будет распространяться, если явно не перехвачено

2 голосов
/ 05 октября 2011

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

2 голосов
/ 05 октября 2011

Вы должны его где-то перехватить, иначе ваше приложение перестанет показывать (или регистрировать) стек трассировки этого исключения.

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

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

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

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

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