Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中尝试两次处理异常_Java - Fatal编程技术网

在Java中尝试两次处理异常

在Java中尝试两次处理异常,java,Java,我正在尝试处理一个异常2次 第一个是定义方法的核心: Class Class1 { public int method (int a, String b) { try { System.out.println(a+" "+b.length()); } catch (NullPointerException e) { // TODO: handle exception System.out.println("catc

我正在尝试处理一个异常2次

第一个是定义方法的核心:

Class Class1 {
    public int method (int a, String b) {
    try {
        System.out.println(a+"  "+b.length());
    }
    catch (NullPointerException e) {
        // TODO: handle exception
        System.out.println("catch from the method");
    }
    finally {
        System.out.println("finally from the method");
    }   
    return 0;
    }
}          
第二个呢

当我在main中调用此方法并向其传递null参数时:

public Class Class2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Class1 c = null;
        try {
            c = new Class1();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            c.method(1, null);
        }
        catch (Exception e) {
            // TODO: handle exception
            System.out.println("catch from the main");
        }
        finally {
            System.out.println("finally from the main");
        }
        System.out.println("\nEnd of the main");
    }
}        
结果是:

从方法中捕获

最后从方法上进行分析

最后从主要

干涸


现在我的问题是,为什么main中的catch块没有被执行?

一旦捕获到异常,它就不再继续,但是可以再次抛出它。如果您想让main也看到异常,则需要在捕获异常后再次抛出该异常。试试这个:

 public int method (int a, String b) throws NullPointerException{
        try {
            System.out.println(a+"  "+b.length());
        }
        catch (NullPointerException e) {
            // TODO: handle exception
            System.out.println("catch from the method");
            throw e;
        }
        finally {
            System.out.println("finally from the method");
        }   
        return 0;
        }
请注意,由于函数中现在有一个抛出,因此需要将其包含在函数定义中


编辑:正如一些人所说,不需要捕获NullPointerException,因为它是一个未经检查的异常。这是因为它是RuntimeException的一个子类。

一旦捕获到异常,它就不再继续,但您可以再次抛出它。如果您想让main也看到异常,则需要在捕获异常后再次抛出该异常。试试这个:

 public int method (int a, String b) throws NullPointerException{
        try {
            System.out.println(a+"  "+b.length());
        }
        catch (NullPointerException e) {
            // TODO: handle exception
            System.out.println("catch from the method");
            throw e;
        }
        finally {
            System.out.println("finally from the method");
        }   
        return 0;
        }
请注意,由于函数中现在有一个抛出,因此需要将其包含在函数定义中


编辑:正如一些人所说,不需要捕获NullPointerException,因为它是一个未经检查的异常。这是因为它是RuntimeException的一个子类。

您可以找到许多关于抛出和捕获异常机制的文本。我发现更重要的是如何最好地利用异常概念

这不完全是对你问题的回答,但可能澄清了当前情况背后的一些概念

经验法则
  • 如果一个方法完成了它的工作,它应该正常返回。如果失败,它应该抛出异常而不是正常返回。方法产生的异常应该包含有关问题的信息(大多数标准异常已经很好地解决了这一问题)

  • 在从属方法中,通常不应使用try/catch。如果出现了问题(方法中出现了一些异常),那么您的方法通常无法完成其工作,它应该通过异常通知其调用方,最简单的方法就是让异常波动通过

  • 在顶级方法(例如,主菜单操作、主菜单操作、按钮单击操作)中,捕获所有异常,通知用户(可能还有管理员)并继续(如果可能/适当)

  • 如果您的方法获取一个异常(例如NullPointerException)并希望向其调用方显示另一个异常,则捕获该异常,创建所需的新异常,将原始异常用作
    原因
    ,并抛出此新异常。就我个人而言,我尽量避免这种“例外翻译”

  • 最后使用
    如果您必须关闭您在体内获得的某些资源,如果不关闭,这些资源将被长时间阻止。想想I/O流、数据库连接/事务和类似的事情。不要仅仅为了内存分配而这样做,这是垃圾收集器的工作

  • 如果您遵循这些规则,您会发现您的代码可以专注于它的主要工作,不会因为大量错误处理而变得杂乱无章,并且在异常情况下仍然是健壮的

    你的榜样 这完全取决于问题“Class1.method()的工作是什么?”

    这可能是“打印这两个数字”。然后,当它得到
    NullPointerException
    时,它将无法完成其工作,因此它不应该正常返回,而是带着异常退出,最容易的方法是什么都不做(根本不做try/catch),只让异常框架执行其自动工作。这意味着它的调用者将获得原始的
    NullPointerException

    public int method (int a, String b) {
        System.out.println(a+"  "+b.length());
    }
    

    如果
    Class1.method()
    的作业是“打印这两个数字,但仅当存在字符串时”,那么您应该捕获其中的NullPointerException(或者更好,使用
    If
    检查),并正常返回(“我完成了我的工作!”)。然后
    Class2.main()
    应该满足在null情况下不打印的要求,并且在调用
    Class1.method()
    后没有理由做任何错误处理。如果
    Class2.main()
    不希望出现这种行为,那么在这种情况下,它不应该调用
    Class1.method()

    您可以找到许多关于抛出和捕获异常机制的文本。我发现更重要的是如何最好地利用异常概念

    这不完全是对你问题的回答,但可能澄清了当前情况背后的一些概念

    经验法则
  • 如果一个方法完成了它的工作,它应该正常返回。如果失败,它应该抛出异常而不是正常返回。方法产生的异常应该包含有关问题的信息(大多数标准异常已经很好地解决了这一问题)

  • 在从属方法中,通常不应使用try/catch。如果出现了问题(方法中出现了一些异常),那么您的方法通常无法完成其工作,它应该通过异常通知其调用方,最简单的方法就是让异常波动通过

  • 在顶级方法(例如,主菜单操作、主菜单操作、按钮单击操作)中,捕获所有异常,通知用户(可能还有管理员)并继续(如果可能/适当)

  • 如果您的方法获取一个异常(例如NullPointerException)并希望向其调用方显示另一个异常,则捕获该异常,创建所需的新异常,将原始异常用作
    原因
    ,并抛出此新异常。就我个人而言,我尽量避免这种“例外翻译”

  • 如果有必要,最后使用