java - 异常浅谈
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反馈给客户.