我们什么时候应该在方法中抛出异常或捕获异常?

2024-05-09

我一直在阅读有关异常的更多内容,但我不确定在什么情况下我们应该抛出一个方法

public void fxml() throws IOException
{
     // method body here
}

或捕获方法内的异常

public void fxml()
{
          FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml.fxml"));

            try
            {
                fxmlLoader.load();
            } 
            catch (IOException exception) 
            {
                throw new RuntimeException(exception);
            } 
}

从 Oracle 的例子来看,它说

有时,代码适合捕获其中可能发生的异常。然而,在其他情况下,最好让调用堆栈上方的方法来处理异常。例如,如果您将 ListOfNumbers 类作为类包的一部分提供,则您可能无法预测包中所有用户的需求。在这种情况下,最好不要捕获异常并允许调用堆栈上方的方法来处理它。

https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

所以我很好奇这是否意味着我们可能不需要该类/方法,并且通过在该方法中执行 try/catch,如果我们不使用它,它就没有任何作用,所以我们“扔掉它”以后用?

似乎类本身也会“抛出异常”以便稍后使用......它只是一个抛出层次结构,直到您最终可以使用它吗?在上面的教程中,几章后面有一章称为“链式异常”,这本质上是稍后使用的方法抛出的情况吗?

我也读过这个帖子何时在 Java 方法声明中使用 throws? https://stackoverflow.com/questions/4392446/when-to-use-throws-in-a-java-method-declaration

但我发现它并没有完全解释我想知道的事情,但是我发现了这种兴趣

如果您正在捕获异常类型,则不需要抛出它,除非您要重新抛出它。在您发布的示例中,开发人员应该执行其中一项操作,而不是同时执行两项操作。

通常,如果您不打算对异常执行任何操作,则不应捕获它。

您能做的最危险的事情就是捕获异常而不对其进行任何操作。

我不太确定他所说的“重新抛出”它是什么意思,除非他说的是抛出该方法并稍后捕获它?

然后他谈到,如果您不打算使用它,则不要执行任何异常操作,因此,如果我们需要它,似乎最好将其丢弃以供以后使用?

然后说它危险吗?为什么是这样?

因此,本质上,如果我们不知道是否要使用它,那么我们应该抛出它,以便可以调用方法本身,或者如果我们知道它将被调用,无论如何,那么我们应该尝试一下/捕获块?

我还注意到我的示例还引发了基于 IOException 的 RuntimeException。因此,从某种意义上说,您可以采用我们抛出的第一个方法,无论异常是什么,然后将其扔到 try 或 catch 块中?看起来 catch 块更适合“RuntimeException”或其他系统异常之一,但也许还有其他用例?

想法?

谢谢您的帮助!


如果您的代码无法完成其工作(也称为“履行其合同”),您将引发异常。发生这种情况的原因可能是调用者向您传递了无效的输入,或者某些外部资源出现故障(例如网络连接丢失)。

当下游存在您可以以某种方式处理的预期问题时,捕获异常。例如,您可能会捕获指示网络问题的异常并重试该操作几次,或者您可能会向用户显示一条错误消息并询问下一步该怎么做。

如果下游代码可能抛出异常,但您的代码位于中间的某个位置并且不知道该怎么做,则只需让异常传递到调用代码即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们什么时候应该在方法中抛出异常或捕获异常? 的相关文章

  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A

随机推荐