我想知道其他SOers在实践中如何处理和/或防止异常。

在什么情况下你会阻止例外,以及如何?

在什么情况下你会捕获异常?

我通常会根据if(foo!=null) {...}来防止'NullPointerExceptions'(和其他类似的)

我发现在大多数情况下,这比使用try-catch块所涉及的所有内容都要小。

当潜在的异常更复杂或更多时,我使用try-catch块。

在我看来,当引用为空(例如,再次)实际表示有效的程序状态时,仅防止NullPointerException(例如)是有意义的。如果没有,你不应该阻止它发生,因为在这种情况下你想要程序死硬。

特别是在Java中,从RuntimeException降序的某些异常(例如IllegalArgumentException)实际上是指示编程错误,如果程序正确则不应该发生这种情况。我试着遵循这个。如果我正在编写一个对其参数设置限制的方法,我不会试图避免抛出异常。我会积极地抛出一个。

如此真实。 如果Java和C#具有不可为空的引用类型,则世界中的错误计数将显着下降。

如果你可以防止异常,那么这样做的编程实践会更好。例如,任何NullPointerException通常都表示编程错误IMO。 (这是一个RuntimeException的原因之一。)

当您希望能够在一层代码中检测到故障条件时,异常会更有用,但您不希望在那里处理故障条件,而是在更高级别的代码中处理故障条件。也就是说,您打算在堆栈中抛出多于一帧的异常 - 或者一直向上抛出堆栈。当您不希望程序能够有意义地处理问题时,例外也很有用。

有三种例外。

运行时异常始终是可以预防的。你只需要正确编程。

如果可能的话,应该将已检查的异常转换为正确的抽象级别(如果他不知道/不关心SQL异常,则不向用户抛出SQLException)或在更高级别处理(即,让它们弹出)并显示/记录正确的消息。

根本不应该处理错误。

有关如何防止RuntimeExceptions sub>的更多详细信息,请参阅该链接

捕获您知道如何处理它们的异常。

你不应该在任何地方检查(foo!= null),检查foo首次使用的位置。之后只需使用foo而无需检查。如果foo在确定它不为null后突然变为null,则会出现大问题。那么例外是合适的。

try {

foo();

}

catch (FooException e) {

}

是一种糟糕的代码味道,应该避免

我将在方法的开头检查输入参数,如果它们超出应该传递给方法的范围,则抛出IllegalArgumentException。这个想法是它是一个编程错误,应该修复它。现在比现场更好。如果在方法的中间我得到一个意外的条件(在列表中为null等),我将记录一个致命的消息并执行System.exit(2)。这又强迫你解决一个问题,而不仅仅是记录它并继续前进。

我在整个代码中使用以下类来验证和中止处理:

这样,您可以立即验证或捕获异常,记录它们并返回中止对象。

一般来说,例外应该是特殊的,例如不可预见的或由于编程错误。

问题是,Java类库中存在一些可疑的设计描述,因此您最终会得到如下惯用语:

class Foo {

static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

int getInt() throws IOException {

int r=0;

for(;;) {

String s=in.readLine();

try {

r=Integer.parseInt(s);

break;

}

catch(NumberFormatException e) {

System.out.println("Please enter a valid integer.");

}

}

return r;

}

}

很明显,代码并不完美(将在EOF上抛出NullPointerException),但它展示了对实际上并不例外的事物使用异常的问题。

我希望我的所有例外都向上移动,除非它们是次要的,然后我会吞下它们(例如:防止索赔条目因为电子邮件通知功能产生了NPE ...我想吞下那个NPE并继续卡车运输因为该程序的真正的肉没有例外)。

我使用这种方法强制Java的大多数不可恢复但已检查的异常:

http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

避免使用那些(NullPointerExceptions,NullReferenceExceptions等)。

抓住那些有点棘手的问题(Sql错误......它们可能不在你的控制范围内,但你需要在它们之后优雅地清理它们)。

我尽可能地防止,但是我抓住用户影响的东西,例如当他们输入错误类型的数据时。在Java中,我有一个我编写的类,它扩展了Scanner并一直要求正确的输入,直到它有效。 (来自CLI)

通常,当异常导致进程中止时,我使用异常。当我要对问题采取某些措施并以某种方式恢复时,我会尝试防止异常发生。

就像,如果一个参数传递给一个子程序,我合理地期望它可能为null,我会检查它为null。例如,在现实生活中,null String通常等效于零长度String,其中我只写。

但是如果一个null String意味着某些东西出现了严重错误,我们应该退出整个过程并向用户显示一个"恐慌 - 中止 - 世界即将结束"类型的消息,那么异常非常方便。你可以将异常方式深入到多个子例程层中,然后在顶部捕获它,显示消息,然后就完成了。

我经常为这些条件创建自己的例外。我的许多程序都带有像这样的代码,只是让我出去,显示一条消息,然后退出。这实际上节省了IF的深度嵌套和从子程序不断检查返回值。

你应该抓住所有例外。使用简单的if语句始终可以防止NullPointerException s。其他一些例外,如大多数IOException,很难被阻止。除了需要使用try / catch块的样板文件外,如果你的类抛出异常,那么将创建该异常的对象并且它必须被垃圾收集...所以通过不抛出异常,你也可以使你的VM更健康。

通常,如果这样做是合理的,您应该首先尝试防止异常发生。很多时候,这是不合理的,也可能是不可能的(尤其是当涉及到io时),但这就是try / catch的用途。特别是,这意味着您应该始终检查指针和数组索引,以防止NullPointerException和ArrayIndexOutOfBoundsException。当然,除非你无能为力,否则无论如何都要重新抛出它。

java捕获子程序异常,防止异常与捕获Java中的异常相关推荐

  1. java异常类型 数组越界_java数组中的异常类型整理

    对于程序中出现异常,是很多程序员不想看到的情况,因为这就需要我们去查询异常的原因,然后进行一些处理异常的操作.在Java数组操作时,也会有一些异常情况的发生.这里我们罗列出了两种:ClassCastE ...

  2. python程序出现了异常会执行哪个语句,python中的异常是什么?应该怎么处理异常?...

    今天这篇文章我们来了解一下python之中异常处理,首先我们需要理解python的异常,只有知道了python所有的异常以及他们发生的原因,我们才能应对python错误和异常处理的方法,从而快速处理异 ...

  3. python异常类封装_在Python中封装异常

    如何使应用程序与使用过的库依赖关系所引发的异常脱钩? [app] --uses--> [lib] --dependson--> [dependency] / / x- \ / `----- ...

  4. 异常规范之阿里巴巴开发手册中的异常规范讲解

  5. 文件传输服务器异常,文件在上传过程中发生异常 文件在上传过程前,安全组...

    文件在上传过程前,安全组件计算散列值失败是什么意思 需要把文件上传页面的网址添加到可信站点,具体操作步骤如下: 天黑路会滑,社会太复杂,还有什么东西比人心更可怕, 首先打开系统的internet选项卡 ...

  6. 【JAVA SE】java中的异常

    目录 什么是异常? 异常的处理 异常的抛出 处理异常 throws声明异常 捕获异常 try{}catch(){}: finally: 异常的处理流程 自定义异常 什么是异常? 异常在我们写代码是特别 ...

  7. Java基础学习第十八讲:Java异常

    Java异常 Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流.为了能够及时有效地处理程序中的运行错误,Java中引入了异常类的概念. ...

  8. 【华为云技术分享】Python 中的异常和错误

    [摘要] 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常和错误 第一:程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测, ...

  9. Java修仙,法力无边(光速回顾Java基础~)

    Java修仙,法力无边(光速回顾Java基础~)✿✿ヽ(°▽°)ノ✿ 目录 第一重 炼体(Java基础编程) 1.1 Java基础概述 1.2 JDK简介 1.3 Java程序的开发 1.4 Java ...

  10. java catch空指针异常处理_Java基础学习:java文件空指针异常处理

    在Java编程中,我们或多或少地会遇到一些程序异常的情况,为了不影响程序的正常执行,我们需要在程序发生异常的情况下,进行一些操作来防止造成更大的损失.例如在我们平时的除法运算中,被除数是不能为0的,如 ...

最新文章

  1. 网站制作与运营离不开几个重要部分
  2. 推荐一个Android开源项目-AisenWeiBo
  3. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
  4. 电镀用整流电源设计matlab,基于MATLAB的三相整流电路的仿真研究毕业设计论文
  5. php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...
  6. html select选择事件_用 Java 拿下 HTML,分分钟写个小爬虫
  7. 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  8. 缓冲池、顺序读取与随机读取
  9. 扫码点菜系统代码_一顿火锅吃出474万天价?扫码点餐时,千万不要这样做
  10. 通过C++实现Android Native Service
  11. tenda无线网卡Linux驱动,Ubuntu 10.04上腾达W541U V2.0 无线网卡驱动的使用
  12. 哈佛大学有没有计算机专业,美国哈佛大学计算机专业课程有哪些?
  13. Redis总结笔记(总结自Redis开发与运维)
  14. vue el-descriptions 样式问题
  15. 【上海市】青年大学习自动提醒 代码脚本
  16. CodeForces Canada Cup 2016 A、B水题 _(:з」∠)_
  17. 数据分析实战二:爬取淘宝商品详情页进行分析
  18. 当代人类不可或缺的至宝—WiFi
  19. 机器人操作系统ROS 编程开发--详细总结
  20. 第八天 Python爬虫之Rquests库打码平台的简单使用

热门文章

  1. tomcat清除缓存配置方法
  2. 福大软工1816 · 第一次团队作业
  3. Oracle 查询单挑语句运行时间
  4. BDKRHash详解
  5. 利用模板引擎配合ajax进行数据的导入
  6. Netbeans、Eclipse中查看JDK源码
  7. TCP传输连接建立与释放详解
  8. Flutter 弧度与角度之间的换算
  9. IOS初始化控制器的两种方法
  10. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp