gpt4 book ai didi

java - Java 中方法签名中的 Throw 和 Throw 语句之间的区别

转载 作者:IT老高 更新时间:2023-10-28 20:58:30 28 4
gpt4 key购买 nike

我试图弄清楚Java中方法签名中的抛出抛出语句之间的区别。方法签名中的抛出如下:

public void aMethod() throws IOException{
FileReader f = new FileReader("notExist.txt");
}

抛出语句如下:

public void bMethod() {
throw new IOException();
}

据我了解,方法签名中的 throws 是通知该方法可能会抛出此类异常。 throw 语句是在相应情况下实际抛出创建的对象。从这个意义上说,如果方法中存在 throw 语句,则方法签名中的 throws 应始终出现。

但是,以下代码似乎没有这样做。代码来自图书馆。我的问题是为什么会这样?我对概念的理解有误吗?

这段代码是 java.util.linkedList 的副本。 @作者乔什·布洛赫

 /**
* Returns the first element in this list.
*
* @return the first element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}

更新答案:

update 1 : 上面的代码和下面的代码一样吗?

// as far as I know, it is the same as without throws
public E getFirst() throws NoSuchElementException {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}

更新 2:检查异常。我需要在签名中有“ throw ”吗?是的。

// has to throw checked exception otherwise compile error
public String abc() throws IOException{
throw new IOException();
}

最佳答案

你说的很对。除了我稍后会提到的一件事。

throws 与名称和参数一样是方法 API 的一部分。客户知道如果他们调用了那个方法,他们需要处理那个异常——通过简单地也抛出它或者捕获它并处理它(这实际上可能需要抛出另一个包装原始异常的异常)。 throws 在编译时处理。

throw 是让运行时知道发生了不好的事情的实际行为——我们担心的异常情况实际上已经发生了。所以需要在运行时处理。

但是当您说“如果方法中存在 throw 语句,则应始终出现方法签名中的抛出”时,您并不完全正确。这通常是正确的,但并非总是如此。我还可以调用另一个在我的方法中抛出异常的方法,如果我没有捕获它,我的方法需要抛出它。在那种情况下,我没有明确抛出相同的异常。

最后一点是,当异常是checked异常时,你只需要在throws中声明一个异常——也就是说它来自Exception的另一端RuntimeException 的类层次结构。常见的检查异常是 IOException 和 SQLException。如果您不自己处理检查的异常,则必须在方法签名的 throws 部分中列出它们。任何继承 RuntimeException 的子类——比如你的示例中的 NoSuchElementException 以及讨厌的 NullPointerException——都是未经检查的异常,不必被捕获或抛出或任何东西。

通常,您对可恢复的问题使用检查异常(客户端知道会发生什么并且可以优雅地处理问题并继续前进)和对灾难性问题(例如无法连接到数据库)使用未经检查的异常。

如果你能通过所有 AOP 的东西,this是关于如何有效使用已检查和未检查异常的精彩讨论。

关于java - Java 中方法签名中的 Throw 和 Throw 语句之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com