调用方法时的异常处理

时间:2018-05-03 21:58:13

标签: java exception-handling

假设我有一个方法'position',它需要2个坐标并创建一个位置对象来保持它们。为了确保这些坐标不超出范围,抛出InvalidPositionException。

public Position(int x, int y) throws InvalidPositionException {
    try {
        if (x > 10 || x < 1 || y>10 || y<1) {   
            throw new InvalidPositionException("Position x = "+x+", y = "+y+" is out of bounds");
        } else {
            setX(x);
            setY(y);
        }
    } catch (InvalidPositionException e) {
        System.err.println(e);
    }
}

如果我现在想要从另一个类创建一个新的位置对象,我会收到错误消息“未报告的异常InvalidPositionException;必须被捕获或声明被抛出”

如何在不创建新位置对象的方法的方法签名中声明“throws”的情况下完成此工作?

3 个答案:

答案 0 :(得分:1)

转到课程InvalidPositionException并将其从RuntimeException继承。

RuntimeException是未经检查的异常,这意味着编译器不会强制您处理它们。当你离开数组的界限时,这是一个很好的例子。每次访问数组时,您都不必编写处理此问题的代码(例如我们处理IOException的方式)。类似的例子是NullPointerException。但是,在这两种情况下,您都可以编写代码来捕获异常并处理它。

如果你是一个经过检查的例外纯粹主义者并且不想要一个try-catch块,另一种处理问题的方法是在你输入数据的任何屏幕上清理数据,并说它在那里超出界限

答案 1 :(得分:1)

来自约书亚布洛赫的Effective Java

  

第72项:赞成使用标准例外

     

将专家程序员与较少程序员区分开来的属性   经验丰富的是专家努力并且通常达到很高   代码重用程度。例外情况也不例外   代码重用是一件好事。 Java库提供了一组   覆盖大多数异常抛出需求的异常   蜜蜂。   ...

     

IllegalArgumentException使用场合 - 非空参数值不合适

此代码是为其创建IllegalArgumentException的经典示例。它扩展了RuntimeException,因此您不需要捕获它。

public Position(int x, int y) {
    if (x > 10 || x < 1 || y>10 || y<1) {   
        throw new IllegalArgumentException("Position x = "+x+", y = "+y+" is out of bounds");
    } 
    setX(x);
    setY(y);
}

P.S。您可能只需将setX(x)替换为this.x = x,将 y 替换为相同的(如果这些设置者中没有额外的逻辑)。

答案 2 :(得分:0)

您需要在创建Position对象的语句周围包含try-catch块。

Position myPosition = null;
try {
  myPosition = new Position(a, b);
}
catch (InvalidPositionException e) {
  // do something if the exception is caught
}