gpt4 book ai didi

java - Java中已检查和未检查的异常,这些断言是否正确?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:26 25 4
gpt4 key购买 nike

我对检查异常非检查异常之间的区别有一些疑问。

我知道检查异常通常代表程序无法直接控制的区域中的无效情况,例如无效的用户输入,数据库问题,网络中断,文件缺失等。

我也知道检查异常异​​常抽象类的子类,并且方法必须为其实现抛出的所有检查异常建立一个策略(要么将检查后的异常进一步传递到堆栈,要么对其进行处理。不知何故)。

那么,实际上,最后一个断言到底意味着什么?

我能否简单地说检查的异常是在编译时检查的。这意味着,如果某个方法引发了检查异常,则应使用 try-catch 块来处理该异常,或者应使用抛出关键字来声明该异常,否则程序将给出编译错误。由于这些异常是在编译时检查的,因此将其命名为“已检查的异常”。

因此,如果一个方法抛出检查异常,我可以用两种不同的方式来处理它:

  • 我必须将其处理为 try-catch 块,如下所示:
    try{
    //statements that may cause an exception
    } catch (exception(type) e(object))‏ {
    //error handling code
    }
  • 使用引发方法声明中使用的关键字,以便明确指定特定方法可能引发的异常。当一个方法声明具有使用throws子句定义的一个或多个异常时,则方法调用必须处理所有已定义的异常。

    因此,如果我说错了一个断言,请纠正我, throws 关键字用于将检索到的已检查异常抛出到堆栈的上层(调用者)中。因此,如果一个方法调用另一个方法抛出一个已检查的异常,如果抛出该异常,则调用方方法必须处理它(例如,通过尝试捕获块)。这个推理正确吗?

    确实,检查异常具有引入紧密耦合形式的缺点,因为如果我有一系列方法,而最后一个抛出一个检查异常,或者我将其处理到其父亲的代码中还是所有中间方法都必须通过方法声明上的抛出关键字来声明异常?这个主张正确吗?

  • 相反,在编译时不检查未检查的异常。这意味着,如果您的程序抛出了未经检查的异常,并且即使您没有处理/声明该异常,程序也不会给出编译错误。在大多数情况下,这些异常是由于用户在用户程序交互过程中提供的不良数据而发生的。程序员应事先判断可能导致此类异常并适当处理它们的条件。所有未经检查的异常都是RuntimeException类的直接子类。

    例如,我可能遇到这样的情况:
    class Example {  
    public static void main(String args[])
    {
    int num1=10;
    int num2=0;
    /*Since I'm dividing an integer with 0
    * it should throw ArithmeticException*/
    int res=num1/num2;
    System.out.println(res);
    }
    }

    编译该类时,编译器不会给我任何错误,但是运行它,我将获得 ArithmeticException tath是一个未经检查的异常,因为它在运行时发生。

    因此,我认为是开发人员必须执行以下操作:
    class Example {  
    public static void main(String args[])
    {
    int num1=10;
    int num2=0;
    /*Since I'm dividing an integer with 0
    * it should throw ArithmeticException*/
    try {
    int res=num1/num2;
    } catch(ArithmeticException e) {
    System.out.println("Division for 0, this is not a good idea !!!");
    }

    System.out.println(res);
    }
    }

    所以我的疑问是:
  • 在我看来,我也可以将尝试捕获块用于未检查的异常。那么,使用 try catch 块(存在于已检查的异常未检查的异常之间)有什么区别?仅仅是使用检查异常我必须使用它(或者在方法声明中使用抛出关键字),否则我将获得编译时错误消息吗?
  • 还有未检查的异常是否会自动传播到上级方法调用的堆栈中?

  • 特纳克斯

    最佳答案

    对于throws引入的耦合,您是完全正确的:throws子句中声明的异常成为方法的公共接口的一部分(一般而言,该术语不涉及Java的接口和公共访问)。但是,这种耦合与声明方法的返回类型或参数类型所引入的耦合没有什么不同。您可以将其视为方法签名的第三个属性。

    在我看来,我也可以将try catch块用于未检查的异常。那么,使用已检查异常和未检查异常之间的try catch块有什么区别?

    您当然可以捕获未检查的异常,但是您应该在程序的最顶层执行此操作,以防止完全崩溃。未检查的异常表示编程错误,因此您无法以有意义的方式处理它们。您能做的最好的就是记录它们并继续前进。

    另外,未经检查的异常会自动传播到上级方法调用的堆栈中吗?

    是的,它们以与throws子句中声明的异常且未捕获的异常相同的方式执行检查的异常。

    关于java - Java中已检查和未检查的异常,这些断言是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29194380/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com