Exception类如何知道ArithmeticException类?

时间:2017-03-05 06:06:11

标签: java subclass superclass

我已经读过超类对象可以指向子类对象但不知道子类的内容。 那么超类如何才能捕获类型子类的异常呢?

我在这里很困惑。请有人帮忙

class abc {
    public static void main(String k[]) {
        try {
            int a = 0;
            int b = 56 / 0;
        } catch (Exception e) {
            System.out.println(" divide by zero ");
        }

    }
}

3 个答案:

答案 0 :(得分:0)

ArithmeticExceptionException的子类型。因此,在您的catch中,您所说的是“抓住Exception的所有内容或Exception的子类型。在这种情况下,包括ArithmeticException

答案 1 :(得分:0)

这是两件独立的事情。 第一种情况是泛型类型不具有特定类型的可见性。第二个是反向的,其中异常与他的特定类型相匹配,如果没有找到,则向上移动类层次结构以查找下一个泛型类型,然后查找下一个类型直到匹配。

在这个特定场景中,AE是E的子类,因此如果你没有AE,它会匹配层次结构中的下一个泛型类型,即异常

答案 2 :(得分:0)

超类并不了解它的子类。反之亦然,即一个子类知道它的直接超类。

您的catch语句有点像if语句,其中instanceof运算符:

if (thrownException instanceof Exception) {
    Exception e = (Exception) thrownException;
    System.out.pritnln("divide by zero");
}

instanceof运算符在逻辑上是通过获取左侧对象的类并检查它或其任何超类是否是运算符右侧的类来完成的。

因此,正如您所看到的那样,Exception并非ArithmeticException了解ArithmeticExceptionException了解catch,命令var iterations = 0; function someFunc(x, y, z) { for (var i=0; i<4; i++) { x[i] = x[i] * 2; y[i] = y[i] * 2; z[i] = z[i] * 2; } iterations++; if (iterations >= 10) return {done:true, x, y, z}; else return {done:false, x, y, z}; } function main() { var x = [0, 0, 0, 0]; var y = [1, 1, 1, 1]; var z = [2, 2, 2, 2]; done = false; while (!done) { let {done, x, y, z} = someFunc(x, y, z); console.log(x, y, z); // Do some other stuff with x,y,z here, // like calling anotherFunc(x, y, z) } } main(); 语句起作用。