AJPFX谈JAVA新手问题之异常处理使用不当
★空的 catch 语句块
犯这种错误的人比较少,一般发生在刚学会 Java 或者刚参加工作不久的人身上。
所谓“空 catch 语句块”就是在 catch 语句块中没有对异常作任何处理(比如记错误日志),导致异常信息被丢弃/忽略。一旦程序不能正确运行,由于查不到任何 log 信息,只好从头看代码,靠肉眼找 bug。
★没有使用 finally
很多人在 catch 语句之后不使用 finally 语句。由于在 try 语句中可能会涉及资源的申请和释放。如果在资源申请之后、资源释放之前抛出异常,就会发生资源泄露。
★笼统的 catch 语句块
有些人为了省事,只在自己模块的最外层代码包一个 try 语句块,然后 catch(Exception)。不管捕获到什么异常,都作统一 log 了事。这种做法比“空 catch 语句块”稍好,但由于不能对具体的异常进行具体处理,对一些可恢复的异常(下面会提到),丧失了恢复的机会。而且也可能导致上述提到的资源泄露的问题。
★使用函数返回值进行错误处理
有些人放着 Java 的异常机制不用,而用函数返回值来表示成功/失败(比如:返回 true 表示成功、false 表示失败),简直是“捧着金碗要饭”。个人感觉,从 C 转到 Java 的人比较容易有此毛病。这种做法会导致如下几个问题:
1. 返回值一般用整数值或布尔值表示,传递的信息过于简陋;
2. 一旦调用者忽略了错误返回码,就会导致和“空 catch 语句块”类似的问题;
2. 对同一个函数的多处调用,都需要对返回值进行重复判断,导致代码冗余。
★不清楚“Checked Exception”和“Runtime Exception”的区别
这个现象比较普遍,俺发现很多2年以上 Java 工作经验的人尚未完全搞明白两者的区别。看来这个问题得详细说一下。
当初Java的设计者有意区分这两种异常,是别有深意的。其中“Checked Exception”用于表示可恢复的异常(也就是你必须检查的异常);而“Runtime Exception”表示不可恢复的异常(也就是运行时异常,主要是程序 bug 和致命错误,你【不需要】检查)。不过这种做法引来了很多争议(包括很多 Java 大牛),鉴于本帖子主要针对新手,以后再专门来聊这个争议的话题。
为了便于理解,下面我举一个例子来说明。假设你要写一个 Download 函数,根据传入的 URL(String 参数)返回对应网页的内容文本。这时候有两种情况你需要处理:
1. 如果传入的 URL 参数是 null,这表明该函数的调用者出 bug 了,而程序本身的 bug 是很难在运行时自我恢复的。这时候 Download 函数必须抛出 Runtime Exception。并且 Download 函数的调用者【不应该】尝试去处理这个异常,必须让它【尽早】暴露出来(比如让 JVM 自己终止运行)。
2. 如果传入的 URL 参数非 null,但是它包含的字符串不是一个合法的URL格式(可能由于用户输入错误导致)。这时候 Download 函数必须抛出 Checked Exception。并且 Download 函数的调用者必须捕获该异常并进行相应的处理(比如提示用户重新输入 URL)。
AJPFX谈JAVA新手问题之异常处理使用不当的更多相关文章
- AJPFX浅谈Java新手问题之缺少良好的编程习惯
★随意地命名 有些新手写程序,当需要定义某个变量名(也可能是函数名.类名.包名等)时,随意地一敲键盘,名字就起好了......若干星期后,碰到某 bug,再来看自己写的代码时,心中暗自嘀咕:“这代码是 ...
- AJPFX谈Java 性能优化之基本类型 vs 引用类型
★名词定义 先明确一下什么是“基本类型”,什么是“引用类型”. 简单地说,所谓基本类型就是 Java 语言中如下的8种内置类型: booleancharbyteshortintlongfloatdou ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 史上最全的 Java 新手问题汇总
史上最全的 Java 新手问题汇总 Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...
- Java 新手的通病
一:对算法和数据结构不熟悉 为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
随机推荐
- 深度学习入门-4.1 AND.py 源码分析
源代码 ------------------------------------------------------------------------------------------------ ...
- Jmeter代理服务器录制请求
1.文档前提说明 1)本文使用jmeter的版本为 apache-jmeter-2.13 及以上版本 2)java版本要求在 1.8.0 以上 注:jmeter版本一般和java相应的版本一起使用,如 ...
- 静态代理、动态代理和cglib代理
转:https://www.cnblogs.com/cenyu/p/6289209.html 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处 ...
- HDU3567 Eight II —— IDA*算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others) ...
- e.target与e.currentTarget的区别
在DOM事件对象中有两个属性总是时不时的困扰我,就是target和currentTarget,有时候很迷惑分不清两者的区别,因此有必要把这两个属性好好梳理一下,加深理解,以便日后的查询. MDN中对t ...
- WAS:Thread "server.startup : 1" (00000020) and may be hung异常
有现场server启动时,启动不了,后台报错如下: [// ::: CST] ThreadMonitor W WSVR0605W: Thread ) has been active milliseco ...
- I.MX6 android 源码下载
/************************************************************************* * I.MX6 android 源码下载 * 说明 ...
- CodeForces19D:Points(线段树+set(动态查找每个点右上方的点))
Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coo ...
- B. Spider Man
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views
Resizing the View Controller’s Views A view controller owns its own view and manages the view’s cont ...