传播的异常必须用Java来捕获?

时间:2011-10-05 19:03:11

标签: java exception

如果我传播一个异常,我最后是否必须抓住它?

假设我有这段代码:

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 个答案:

答案 0 :(得分:2)

您必须在某处捕获它,否则您的应用程序将退出显示(或记录)该异常的堆栈跟踪。

但是,你应该抓住它们。基本上,您应该在可以对其进行操作的地方捕获它们,例如更改输入数据,询问用户其他输入或仅通知用户错误。

答案 1 :(得分:2)

从语法上讲,它可以做到这一点,但是现在调用Vehicle构造函数的人必须担心Exception,所以你应该考虑它是否在语义上是正确的。在这个例子中,传播异常是可以接受的,因为构造函数采用初始速度,这可能是负的。如果不是这种情况,我会抓住Execption

答案 2 :(得分:2)

Java中的已检查异常会被传播,直到发生以下情况之一:

  1. 异常会在catch块中被捕获
  2. 达到main()方法(如果此时未捕获,则JVM崩溃)
  3. 定义了未捕获的异常处理程序并捕获异常(请参阅http://stuffthathappens.com/blog/2007/10/07/programmers-notebook-uncaught-exception-handlers
  4. 请注意,除非明确捕获,否则还会传播未经检查的异常(即从RuntimeException扩展的异常)

答案 3 :(得分:0)

你不需要自己捕捉它,但你可能想要。如果您自己不处理它,它将继续传播到JVM,此时它将崩溃并将堆栈跟踪打印到标准错误。

如果异常是您的应用程序可以处理和恢复的内容,那么您显然需要在某个地方放置一个可以处理这种特定情况的catch语句。