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里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
随机推荐
- MapReduce Join的使用
一.Map端Join 可连接两个都非常大的数据集之间可使用map端连接,数据在到达map端之前就执行连接操作. 需满足: 两个要连接的数据集都先划分成相同数量的分区,相同的key要保证在同一分区中(每 ...
- Codeforces Round #326 (Div. 2)
B. Duff in Love time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Android上的水果忍者刀锋效果(JAVA实现)
显示刀锋的View package com.wbhuang.myninjia; import java.util.ArrayList; import java.util.List; import an ...
- tload
tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语法 tload(选项)(参数) 选项 -s:指定闲时的刻度: - ...
- 一步一步学Silverlight 2系列(13):数据与通信之WebRequest
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- HDU5890:Eighty seven(Bitset优化背包)
Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach ch ...
- 尚观Linux最佳入门高清视频教程033/133/253
[高清]Linux 最佳入门ULE112- RHCE033部分高清视频教程[尚观原创] 视频简介:高清RHCE033部分是RHCE考试中的基础部分,同时也是我们Linux入门的必 备学习资料.想学好L ...
- Where Amazing Happens
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- windows动态磁盘导致的分区问题
上次说到由于装双系统导致我的win7启动不了了,一直以为是不是在ubuntu的安装界面点错了什么东西导致的,甚至认为是不是server的安装程序有点bug,直到今天继续折腾才发现了问题所在,跟ubun ...
- c++常见面试题30道
1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,new ...