假设我有一个方法'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”的情况下完成此工作?
答案 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
}