Java 中的检查异常与非检查异常

2023-12-15

我在理解之间的差异时遇到一些问题checked and uncheckedJava 中的异常。

  1. 首先,checked异常应该在编译时查找异常。不同来源提供的示例引用了数据库连接、文件处理等其中一些,而unchecked异常应该查找程序员的错误,例如索引超出数组范围等。

难道不应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您在编译时不会打开文件句柄,那么为什么在编译时会查找可能的错误呢?另一方面,对超出其范围的数组进行索引已经在程序中完成,可以在编译时检查(如果异常索引是在运行时由用户提供的,那么它是运行时就可以了)问题)。我在这里缺少什么?

2 其次,怎样才能RunTimeException,本身就是unchecked, 子类Exception,即checked?这意味着什么?

我在 Herbert Schildt 的书中找到了一个例子,解释了checked例外情况:

class ThrowsDemo {
   public static char prompt(String str)
      throws java.io.IOException {
  System.out.print(str + ": ");
  return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

Is the throws这里需要子句吗?为什么我不能正常地使用try-catch像这样的声明(抱歉我不知道如何模拟IO Exception,所以我自己无法检查!):

class ThrowsDemo {
   public static char prompt(String str)  {
     System.out.print(str + ": ");
     return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

CheckedException 需要由调用者处理,Unchecked 异常则不需要。

因此,当您设计应用程序时,您应该考虑您正在管理什么样的特殊情况。

例如,如果您设计一个验证方法来检查某些用户输入的有效性,那么您知道调用者必须检查验证异常并以美观的方式向用户显示错误。这应该是一个已检查的异常。

或者,对于那些可以恢复的异常情况:假设您有一个负载平衡器,并且您希望通知调用者“n”台服务器之一已关闭,因此调用者必须恢复事件,将消息重新路由到另一台服务器;这应该是一个已检查的异常,因为调用者(客户端)尝试恢复错误至关重要,而不要只是让错误破坏程序流程。

相反,有许多情况不应该发生,和/或应该破坏程序。例如,编程错误(如除零、空指针异常)、API 的错误使用(IllegalStateException、OperationNotSupportedException)、硬件崩溃或一些不可恢复的小情况(与服务器的连接丢失),或世界末日:-);在这些情况下,正常的处理是让异常到达代码的最外层块,向用户显示发生了不可预测的错误,并且应用程序无法执行任何操作来继续。这是一个致命的情况,因此您唯一能做的就是将其打印到日志中或在用户界面中向用户显示。在这些情况下,捕获异常是错误的,因为捕获异常后需要手动停止程序以避免进一步的损坏;所以最好让某种异常“引起轰动”:)

由于这些原因,JRE 中也有一些未检查的异常:OutOfMemoryError(不可恢复)、NullPointerException(这是一个需要修复的错误)、ArrayIndexOutOfBoundsException(另一个错误示例)等等。

我个人认为 SQLException 也应该不检查,因为它表示程序中的错误,或者数据库的连接问题。但是有很多例子,您会遇到异常,但您实际上不知道如何管理(RemoteException)。

处理异常的最好方法是:如果可以恢复或管理异常,就处理它。否则让异常过去;其他人将需要处理。如果你是最后一个“别人”,并且不知道如何处理异常,只需显示它(记录或显示在 UI 中)。

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

Java 中的检查异常与非检查异常 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 创建自定义 NSAttributedString.Key

    我正在尝试构建一个简单的笔记应用程序 目前 我关注的是使用不同文本样式设置文本的可能性 例如正文 标题 粗体 斜体等 我用了一个NSAttributedString设置不同的文本样式 现在 我想检测所选文本应用了哪种样式 我认为一个好方法是
  • Bash 实时读取 STDOUT 流

    我已经搜索过这个并期望找到数百个解决方案 但没有找到 我想读取 STDOUT 流并等待特定字符串出现 而不等待该过程完成 我现在所拥有的 等待该过程完成后再返回输出 RESP execute some command 2 gt 1 if R
  • 如何让 jQuery Sticky Float 插件反应动态页面高度变化?

    我目前正在使用 StickyFloathttp plugins jquery com project stickyfloat我通过 jQuery 动态更改对象所在的 div 的高度 CSS 高度的更改效果很好 但 StickyFloat 无
  • 使用 @JsonView 排除(如 @JsonIgnore)与 play 框架默认 json writer?

    看来你不能混合 JsonIgnore和 JsonView 我想默认隐藏一个字段 但在某些情况下显示它 基本上我已经有了这个设置 class Parent extends Model public Long id public Child c
  • 如何重构数千行Java代码?有没有可用的工具?

    在我们的应用程序中 我们有两个或三个类 其中包含整个 Java Swing 应用程序逻辑 这两个或三个类包含大约 7k 行代码 现在我被分配了重构这段 Java 代码的任务 我该如何开始 有没有可用的工具可以进行重构或至少指导我们 我推荐
  • 使用 ASP.NET MVC 的 HttpHandler

    如果我有一个标准 AXD HttpHandler 和 axd 的默认忽略路由 那么为什么 ASP NET MVC 仍然处理子目录中的请求 例如 如果有针对 Content Css css 的请求 axd d 如果请求是在 root css
  • 为什么这个 .equals() 代码示例返回“false”? [复制]

    这个问题在这里已经有答案了 考虑 class Dog int height int weight String name public class DogTest public static void main String args Do
  • MySQL将CHAR(32)数据类型转换为BINARY(16)而不丢失数据

    嗨 我有一张桌子 其中有一列char 32 数据类型 我需要将其转换为BINARY 16 数据类型 我尝试过更改列类型 但这会删除列中的所有数据 以下代码是我更新列的数据类型的方法 这导致我丢失了该列中的所有数据 ALTER TABLE t
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • 是(n+1)!按照 (n!) 的顺序?你能给我一个证明吗?

    那 n 1 呢 另外 如果你能给我一个证明 可以帮助我更好地理解 我被困在这一点上 证明 n 1 在 O n 中 你必须证明存在一个常数 c 以便对于所有足够大的 n n gt n0 不等式 n 1 lt c n 成立 然而 由于 n 1
  • 使用 jquery 将下拉菜单链接到锚文本

    我在我的页面上选择下拉菜单
  • 未找到名为 os 的模块 - Django、mod_wsgi、Apache 2.2

    我正在尝试设置 apache mod wsgi 和 django 我的 apache 错误日志中出现了内部服务器错误 Wed Jun 22 21 31 55 2011 error client 1 mod wsgi pid 2893 Tar
  • 将 Json 文件内容保存到 python/pandas 中的 CSV 文件

    如何将 数据 信息放入最后所示的 csv 表中 以及正确的 标头 以便源服务器不会让我以为我正在抓取数据 到目前为止我写的代码如下 import requests json headers User Agent Mozilla 5 0 da
  • 令人困惑的宏和枚举定义

    我正在浏览一些 Route netlink 源代码 我想弄清楚 RTNLGRP NEIGH 的值是多少 Source http lxr free electrons com source include linux rtnetlink h
  • 使用 OpenGLES 抗锯齿去除绳索的锯齿状边缘

    我已经实现了绳索 其中我使用 Revolute 关节连接动态 b2bodied 现在我成功创建了这条绳索 但我的绳索看起来不光滑 我希望它们像丝带一样光滑 任何对此有想法的人 我发现它可以通过 openGLES 使用抗锯齿来实现 但仍然不知
  • PHP SimpleXML 大文件没有额外的内存使用

    在每一篇有关 SimpleXML 性能和内存使用的文章中 都会提到所有解析的内容都存储在内存中 处理大文件将导致大量的内存使用 但最近我发现使用 SimpleXML 处理大文件不会导致大量内存使用 甚至几乎不会导致内存使用 有我的测试脚本
  • 删除 Azure 资源组中年龄超过 x 天的所有资源

    我尝试在资源组 python api 中的资源上 扩展 creationTime 这样我就可以找到它的年龄 如果 gt max age days 我就会删除资源组中的资源 但creationTime似乎在资源上不可用 是否有另一种方法可以根
  • 用多种颜色为轴刻度文本着色

    我正在尝试绘制一个heatmap using R s plotly包 我希望为 y 轴刻度文本的特定标签设置特定的颜色 这是一个示例数据集 set seed 1 df lt reshape2 melt matrix rnorm 100 10
  • ASIO 示例代码在应该之前关闭套接字

    我需要一个使用 ASIO 的并行同步 TCP 解决方案 我正在尝试从这些示例中获取示例代码 https github com jvillasante asio network programming cookbook tree master
  • Java 中的检查异常与非检查异常

    我在理解之间的差异时遇到一些问题checked and uncheckedJava 中的异常 首先 checked异常应该在编译时查找异常 不同来源提供的示例引用了数据库连接 文件处理等其中一些 而unchecked异常应该查找程序员的错误