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

时间:2018-02-08 10:48:06

标签: java exception

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

尝试/捕获

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

投掷

随着扔,我抛出一个错误,因为我想? 因此,如果我想验证用户年龄,说所有超过20岁的人并且用户不符合要求,我会抛出错误吗?

抛出

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

2 个答案:

答案 0 :(得分:1)

尝试/抓住

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
}

<强>抛出

在处理checked exceptions时,

throws用作关键字。这是一种让呼叫者知道他们可能需要处理的检查异常的方法。

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

答案 1 :(得分:0)

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

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

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

你有两种方法:

  • 捕捉异常

  • 让异常传播给调用者

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

对于没有RunTimeException s,你没有这个约束,因为编译器并没有强迫你处理它。如果您愿意,可以处理它们。