在具有返回类型的方法中,return语句是可选的,它不是无效的,但会引发异常?

时间:2018-12-23 11:08:17

标签: java

这里我有一个预期返回布尔值的方法:

static boolean display()
{
    }

编译失败,因为此方法必须返回布尔类型的结果。

但是,如果修改方法如下:

static boolean display()
{
    try{
        throw new ArithmeticException();
    }
    catch(ArithmeticException e)
    {
        throw e;

    }
    finally
    {
        System.out.println(finally);
    }
}

即使我没有添加任何return语句,为什么编译不会再失败?

如果在catch块中我不包含throw语句,则由于先前的原因,编译将再次失败。

3 个答案:

答案 0 :(得分:2)

Java编译器进行(有限的)流分析,当它可以确定所有控制流导致异常时,就不需要返回。

答案 1 :(得分:0)

要了解,请尝试将return true;放在方法的末尾。然后,您将收到错误消息,调用不可达语句。

发生这种情况是因为您的方法总是引发异常。因此,最后您不需要返回值,因为它已经在此之前引发了异常并结束了方法

答案 2 :(得分:0)

您:即使我没有添加任何return语句,为什么编译仍不会失败?

  

答案:当您在try块中明确抛出异常时,再次   在catch块中,您显式抛出异常,编译器   不会引发错误,因为您引发了异常   明确地使用throw关键字,该关键字会突然终止   正常的代码流,并停止执行所有后续代码   在显示方法和控件中直接转移到调用方   方法

    public class StackOverFlowReturn {

    public static void main(String[] args) {
        try {
            System.out.println(display());
        } catch (Exception ae) {
            System.out.println("Arithmetic Exception");
        }
    }

    static boolean display() {
        try {
            throw new ArithmeticException();
        } catch (ArithmeticException e) {
            throw e;

        } finally {
            System.out.println("finally");
        }

    }
}
  

输出:

     

最终

     

算术异常

     

在catch块中,如果您代码返回而不是显式抛出   那么

public class StackOverFlowReturn {

        public static void main(String[] args) {
            try {
                System.out.println(display());
            } catch (Exception ae) {
                System.out.println("Arithmetic Exception");
            }
        }

        static boolean display() {
            try {
                throw new ArithmeticException();
            } catch (ArithmeticException e) {
                return true;

            } finally {
                System.out.println("finally");
            }

        }
    }
  

输出:

     

最终

     

true

您:如果我在catch块中未包含throw语句,则由于先前的原因,编译将再次失败。

  

答案:当您在try块中明确抛出异常时,它   没有必要在catch块中有明确的抛出。您可以   代码如下:

 public class StackOverFlowReturn {

        public static void main(String[] args) {
        System.out.println(display());
    }

    static boolean display() {
        try {
            throw new ArithmeticException();
        } catch (ArithmeticException e) {
            System.out.println("Arithmetic Exception");
        } finally {
            System.out.println("finally");
        }
        return true;
    }
}
  

输出:

     

算术异常

     

最终

     

true