首页 文章

调用方法时的异常处理

提问于
浏览
0

假设我有一个方法'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 回答

  • 1

    转到类 InvalidPositionException 并使其继承自 RuntimeException .

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

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

  • 1

    来自Joshua Bloch的Effective Java

    项目72:支持使用标准异常将专家程序员与经验不足的程序员区分开来的一个属性是专家努力并通常实现高度的代码重用 . 代码重用是一件好事的规则也不例外 . Java库提供了一组异常,涵盖了大多数API的大多数异常抛出需求 . ... IllegalArgumentException使用场合 - 非null参数值不合适

    此代码是为其创建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);
    }
    

    附:你可能只需要 this.x = x 替换 setX(x) ,y代替相同(如果那些setter中没有额外的逻辑) .

  • 0

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

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

相关问题