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

需要更好地解释Java中的try/catch/throw/throws异常处理吗,java,exception,Java,Exception,我有点不确定Java中的try/catch、throw和throw之间的区别,每个网站似乎都有一种不人道的解释方式,我尝试过Oracle网站,但我无法理解他们的解释,这是正确的吗 尝试/抓住 使用try-catch,我想尝试一段代码,如果出现问题,就这样做 扔 使用throw,我抛出一个错误是因为我想? 所以,如果我想验证一个用户年龄,比如说所有超过20岁的人,而用户不符合要求,我会抛出一个错误 投掷 使用Throws,我抛出了一个错误,但是其他东西处理了异常?这是另一个方法/类吗?Try/Ca

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

尝试/抓住

使用try-catch,我想尝试一段代码,如果出现问题,就这样做

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

投掷

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

Try/Catch

对。我们显式地抛出了一个异常。例如,如果方法的调用方违反了方法的约定,则可以执行此操作。也许一个论点不能是否定的

在这种情况下,处理此问题的最佳方法是抛出一个异常,该异常停止我们正在执行的操作,并允许调用方在堆栈的更上层处理此问题:

/** 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修饰符以第二种方式寻址


对于无运行时异常,您没有此约束,因为编译器不会强制您处理它。如果您愿意,您可以处理它们。

“throws”不会抛出任何东西。它只通知调用方法/。。。可能会抛出异常,他们可能必须实现异常处理,或者在抛出异常时自己抛出异常。从这里开始:try/catch:ahndle异常发生的位置。抛出:您可以确定程序中断的情况,并希望在程序进一步运行之前中止该程序。Throws:表示方法可以抛出异常,该异常必须在其他地方处理,主要用于将服务器异常委托给client@Stultuske我已经这样做了,但我无法理解术语,我需要一个简单得多、技术性不强的解释,这样我就可以从那里开始工作;您的解释是“不会抛出”,但它不会运行,因为第一个调用抛出一个未处理的异常。鉴于这是一个由不了解异常处理工作原理的人提出的问题,并希望具体了解这一点,因此提及这一点可能是件好事。@Stultuske说得对。我只是把它们颠倒过来,因为我lazy@Michael完美,完美地解释了一切@Ninja2k很乐意帮忙
/** 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
}