java提供异常处理机制中,可以分为RuntimeException和checked Exception两种.

RuntimeException

  是运行时异常,是程序本身无法解决的.例如,对于一个用户注册网站,如果当前用户名已经被使用,则解决方案只能是当前用户使用新的用户名, 而程序本身是无法解决的(我们总不能通过程序将原有用户名删除,不给他使用,然后给当前用户注册吧...). 也可以说,是由调用者决定的.

  企业开发中,一般自定义(给用户反馈信息)的异常偏向于使用RuntimeException,这是因为,方法的调用者不需要进行处理(如果有只能继续往上抛),也最好不要处理.也就是很多人说的,不要去捕获RuntimeException.

checked Exception

  例如java.io.UnsupportedEncodingException,一般是程序指定不恰当的编码而造成的,这完全是要程序去解决的,丢给用户也没有用.

另外,提一下我总结的处理异常的方式:

  java本身提供给我们的两种方式,其实正和我们的需要:1)要么往方法外抛出; 2)要么使用try catch, 然后看业务需要进行处理.下面说第一种情况:

  例如,我们要定义一个方法,进行除非操作.我们可以自定义一个RuntimeException,

/**
*数字不合理的异常类.
*/
class NumberInvalidException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L; public NumberInvalidException(String msg) {
super(msg);
}
}

然后我们定义一个方法(我们假设对于除数为零的操作不进行处理),则可将方法定义为诸如:

	/**在非顶层调用中,一般可以将异常全部抛出.
* @param a
* @param b
* @return
*/
static int divide(int a, int b) {
if(b == 0)
throw new NumberInvalidException("除数不能为:" + b);
return a / b;
}

这样我们的方法就不会除数为零的运算进行处理.直接抛出给调用者.

  对于第二种情况,也就是使用try catch进行处理,不过这要看业务逻辑的需要才行(例如,对于调用者有时传递空值,我们可能要对某个变量赋默认值).不过,一般来说,非顶层的方法,都是可以网上抛出异常,要看业务需求,不能随意try catch(try catch顾名思义就是处理, 除非你真的懂怎么处理, 否则一般都要往方法外抛).

  就像做一个项目一样, 做的一个方法可能要别很多人调用,而要怎么处理,很多时候要看调用者的实际需要.我总结的一个处理异常的方式:除非你知道怎么处理,要么就抛出异常.

  一般的做法是,在非顶层方法,都抛出异常,然后在顶层调用者使用 try catch, 然后将 异常的 Message反馈给客户.

java - 异常浅谈的更多相关文章

  1. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. 【Java】浅谈Java IO

    注意 本文的代码,为了学习方便,简化代码复杂度,未考虑拆包.粘包等情况的处理.所以仅供学习使用,不能用于实际环境. 阻塞IO,BIO Java1.1发布的IO是BIO.阻塞地连接之后,通过流进行同步阻 ...

  3. java集合浅谈(一)

    一.类库结构图概览 容器对象仅能持有对象引用(对象的指针),而不是Copy对象信息,从网上搜得几张Java中集合类库的结构图,如下所示: 二.解说Collection 2.1 Collection ( ...

  4. java多线程浅谈

    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 分这几种情况:    1.其他方法前是否加了synchronized关键字,如果没加,则能.    2 ...

  5. Java:浅谈InputStream的close方法

    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...

  6. 【JAVA】浅谈java内部类

    一.什么是内部类? 到底什么是内部类呢?通俗的讲,就是在类内部定义的类,包括定义在一个类的方法外面.方法里面或者代码块中. 二.为什么要使用内部类? 为什么我们要不走寻常路,把一个类定义在另一个类的内 ...

  7. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  8. 通过Java代码浅谈HTTP协议

    最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...

  9. java序列化浅谈

    首先大家进来第一个疑问肯定是"什么是序列化?为什么要使用序列化?怎么实现一个简单的序列化案例?" 1.序列化就是把对象以一种规范的二进制形式存在内存中,另一边以反序列化方式获取: ...

随机推荐

  1. Tag file directory /struts-tags does not start with "/WEB-INF/tags"

    使用自定义标签,记得引用路径 <%@taglib prefix="s" uri="/struts-tags" %>

  2. ARM学习笔记2——分支跳转指令

    一.Arm指令条件码和条件助记符 二.跳转指令B 1.作用 跳转指令B使程序跳转到指定的地址执行程序(跳转范围是PC-32MB到PC+32MB) 2.指令格式(注:B后面如果有条件,条件就是紧跟在B后 ...

  3. linux下用Apache一个IP多个网站多域名配置方法

    如有两个域名,分别是desk.xker.com和tool.xker.com,需把这两个域名都绑定到IP是219.13.34.32的服务器上 1.首先需在域名供应商管理页面指定域名和IP的对应关系 2. ...

  4. std::move()和std::forward()

    std::move(t)负责将t的类型转换为右值引用,这种功能很有用,可以用在swap中,也可以用来解决完美转发. std::move()的源码如下 template<class _Ty> ...

  5. GRUB损坏后,如何修复windows启动mbr

    今天使用Ghost装系统遇到windows7不能启动的问题,采用下面帖子中的部分命令搞定之. 我自己是直接使用: 插入windows7安装光盘,从光盘启动,在光盘启动完成后,按下shift+f10键, ...

  6. yum puppet 并整合控制台

    上篇说了下在ubuntu12.04上安装puppet,安装的版本为puppet2.7.11版本,今天尝试了下在CentOS6.4系统上安装puppet 3.1.1版本,本文参考chenshake的文章 ...

  7. Shell break和continue命令

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环. break命令 break命令允许跳出所有循环(终止 ...

  8. eclipse 反编译class 文件 插件-jad

    1.下载 jad.exe  http://pan.baidu.com/s/1i3Ga33n 2.下载jadeclipse http://pan.baidu.com/s/1bn4H1iZ  放在ecli ...

  9. 【转载】Storm TickTuple 意外停止

    原文链接转自:http://woodding2008.iteye.com/blog/2328114 Storm的滑动窗口TickTuple通常用来控制bolt定制执行入库操作,使用过程中遇到了Tick ...

  10. Java和Tomcat类加载机制

    转自:http://blog.csdn.net/codolio/article/details/5027423 加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发.调试Web ...