繁体   English   中英

需要更好地解释 Java 中的 try/catch/throw/throws 异常处理

[英]Need a better explanation for try/catch/throw/throws exception handing in Java

我有点不确定 Java 中的 try/catch、throw 和 throws 之间的区别,每个网站似乎都有一种非人道的解释方式,我尝试过 Oracle 网站,但我无法理解他们的解释,这是正确的?

试着抓

使用 try catch,我想尝试一段代码,如果出现问题,请执行此操作。

使用throw,我抛出一个错误是因为我想要? 所以如果我想验证一个用户的年龄,比如说所有 20 岁以上的人并且用户不符合要求,我会抛出错误吗?

投掷

使用 Throws 我抛出一个错误但其他东西处理异常? 这是另一种方法/类吗?

试着抓

try
{
    // try to do some actions
}
catch(SomeExceptionType exception)
{
    // if the above actions throw a SomeExceptionType, do these actions
}

正确的。 我们明确地抛出异常。 例如,如果某个方法的调用者违反了您的方法契约,您就可以这样做。 也许一个论点不能是否定的。

在这种情况下,最好的处理方法是抛出一个异常,停止我们正在做的事情,并允许调用者进一步处理这个问题:

/** Do a thing. myInt must be positive */
void someMethod(Integer myInt)
{
    if (myInt < 0)
    {
        throw new IllegalArgumentException("Can't be negative");
    }
    // do something
}

void myCaller()
{
    someMethod( 1); // won't throw
    someMethod(-1); // will throw
}

投掷

throws在处理检查异常时用作关键字。 这是一种让调用者知道他们可能需要处理哪些已检查异常的方法。

这些方法可以决定处理问题(即 try-catch),也可以自己声明要抛出的相同异常类型以将异常传播给调用者(等等)

您忘记了一个重点:在 Java 中,编译器不会以相同的方式处理所有异常。

编译器确保处理已检查的异常。
这些异常不是从RuntimeException继承的,而是从Exception (直接或间接)继承的。

因此,无论您在代码中抛出什么或第三个类的方法声明抛出已检查异常,您都必须显式处理它。

你有两种方法:

  • 捕获异常

  • 让异常传播给调用者

try/catch解决第一种方法,而在方法声明中指定throws修饰符解决第二种方法。

对于没有RunTimeException s,您没有此约束,因为编译器不会强制您处理它。 如果你愿意,你可以处理它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM