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 异常处理尝试不捕获,但使用finally_Java - Fatal编程技术网

Java 异常处理尝试不捕获,但使用finally

Java 异常处理尝试不捕获,但使用finally,java,Java,上面的代码工作正常,但是当我将testMethod()的返回类型更改为void并更改行return4时到系统输出打印ln(“一些打印消息”)导致编译问题 任何人都可以给出它为什么会给出编译错误的解决方案吗?问题是finally块中的return语句会导致try块中可能抛出的任何异常被丢弃 当您从finally中删除返回时,代码所做的就是抛出一个选中的异常,它要求您抛出异常或捕获异常,这就是编译器出错的原因 看 返回finally的行为在Java语言规范中进行了描述,并在这里得到了很好的

上面的代码工作正常,但是当我将
testMethod()
的返回类型更改为void并更改行
return4时
系统输出打印ln(“一些打印消息”)导致编译问题


任何人都可以给出它为什么会给出编译错误的解决方案吗?

问题是finally块中的return语句会导致try块中可能抛出的任何异常被丢弃

当您从finally中删除返回时,代码所做的就是抛出一个选中的异常,它要求您抛出异常或捕获异常,这就是编译器出错的原因


返回finally的行为在Java语言规范中进行了描述,并在这里得到了很好的解释

public class ExceptionTest {
    public static void main(String[] args) {
        ExceptionTest et = new ExceptionTest();
        try {
            et.testMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }   
    public int testMethod()  {
        try {           
            throw new Exception();
        }finally {
            return 4;
        }
    }
对我来说,唯一的编译问题是方法声明中缺少“抛出异常”

这是输出:

public class ExceptionTest {
    public ExceptionTest() {

    }

    public static void main(String[] args) {
        ExceptionTest et = new ExceptionTest();
        try {
            et.testMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void testMethod() throws Exception {
        try {
            throw new Exception();
        } finally {
            //return 4;
            System.out.println("hello finally");
        }
    }
}

问题似乎是为什么在第一种情况下它没有给出错误,而您显然没有捕获异常或声明要抛出异常。在Java8中工作正常…@Paul我在Java8中得到错误。@宪兵刚刚注意到我的错误。我用
RuntimeError
运行了它。我是在一次采访中了解到这个问题的,你能详细解释一下为什么会放弃这个异常吗?我没有在你的链接中找到任何关于为什么会发生这种情况的直接解释。在问题中,它说在删除return语句时,问题就出现了。@c当你
返回
时,异常显然被丢弃,不需要捕获。这就是为什么你没有得到你期望得到的错误。是的,但这不是问题-问题是“有人能给出为什么它会产生编译错误的解决方案吗?”->编译错误会在添加“抛出异常”后消失。@cslotty“解决方案”一词被OP误用,应该是“答案”。问题的其余部分说“……为什么它会给出编译错误?”。您没有抓住要点。返回
int
的方法不会出现编译错误,但如果它是
void
方法,则会出现编译错误,问题是为什么会出现这种情况。这不是问题的答案。嗯。。。。。如果您运行原始代码,您可以看到异常明显被忽略-它进入finally并返回int。那么,如果行为是明显的并且可以测试和验证,为什么要问这样的问题呢另外,问题是“有人能给出它为什么会给出编译错误的解决方案吗?”这就是我所做的-编译错误会随着添加“抛出异常”而消失。根本不清楚为什么会忽略异常,这就是问题所在。没有。“任何人都能给出它为什么会给出编译错误的解决方案吗?”——原始问题必须更改以反映您所说的内容。
hello finally
java.lang.Exception
    at ExceptionTest.testMethod(ExceptionTest.java:17)
    at ExceptionTest.main(ExceptionTest.java:9)