具体问题、具体分析、没有万能的准则。糊涂,不知道对错,但在思考,时间会验证自己曾经的思考。
1、异常需要在第一次出现的地方被记录
2、尽量使用原生的异常。
3、使用异常?”使用“2个字怎么理解,抛出异常还是捕获异常?
4、又不捕获,又不抛出,RuntimeException的意义是什么?提示程序员这可能出现错误,注意代码质量?
一、什么时候使用Checked异常、Unchecked异常?
问题:使用Checked异常需要太多的try..catch块
使用Unchecked异常,编译器忽略,程序员不知道何种情况下该处理此异常。
方法:将异常的处理交给程序员自己判断,使用Uncheked Exception,有能力处理的调用者可以进行高级处理,一般调用者干脆就不处理。
在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常,由调用者自己去决定是否捕获unChecked异常
二、Unchekced exception需要被捕获吗?
通常情况下不应该,因为它代表的是代码的错误,应该通过编写代码解决,而不是异常。
如果捕获了Unchecked exception,违反了原子性。忽略了错误, 程序出现了错误就应该挂起。
三、页面传递来的参数,应该做null检查吗?
对于潜在的NullPoninterException,属于程序错误,没办法恢复,不应该捕获,应该用if判断之类的处理,而不是异常。
可以如下处理?还是忽略,等待调用的时候抛出?定义自己的错误,包装一下再抛出?
method(arg0,arg1){
if(arg0==null){
throw new NullPointerException();
}
}
四、如何处理SQLException异常?
try{
....
PrepareStatement.excuteQuery();
....
}catch(SQLException e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
}
五、此处潜在的NullPointerException该怎么处理?
List<ValueObject> objects=new ArrayList<ValueObject>();
List<Object[]> result=Query.list();
ValueObject obj=null;
try{
for(int i=0;i<result.size();i++){
Object[] temp=result.get(i);
pojo=new ValueObject();
pojo.setId(Integer.valueOf(temp[0].toString();)
pojo.setName(temp[1].toString());
//如果temp[1]为null,代码处理?if(null!=temp[1]){pojo.setName(temp[1].toString())}
pojo.setAge(Integer.valueOf(temp[2].toString()));
//如果valueOf("123!@#")的情况怎么处理?不可能出现这种情况(数据库类型已经限制,不可能有此类数据)。
}
}catch(NumberFormatException e){
throw new MyException("....(描述或者异常编号)",e);
//假设捕获了异常,需要返回吗?结果已经是不正确的,返回了也没任何意义。
//return objects();
}
六、什么情况下定义自己的异常?
J2EE项目中,一般分为MVC三层。一般我们都是在最底层进行JDBC调用,而每一个JDBC的调用都会抛出SQLException的checked异常。只要有一个JDBC调用,所有上层的接口都会要求抛出SQLException异常。因为我们处理SQLException的方式就是把它继续往上抛。这样一来就破坏了我们业务接口。
SQLException这些J2EE系统级的异常严重的影响了我们的业务接口。我们对系统进行分层的目的就是减少系统之间的依赖,每一层的技术改变不至于影响到其它层。
为了避免系统级的checked异常对业务系统的深度侵入,我们可以为业务方法定义一个业务系统自己的异常。针对
SQLException,RemoteException这些非常严重的异常,我们可以新定义一个unChecked的异常,然后把
SQLException,RemoteException封装成unChecked异常后抛出。
如果这个系统级的异常是要交由上一级调用者处理的,可以新定义一个checked的业务异常,然后把系统级的异常封
存装成业务级的异常后再抛出。
一般地,我们需要定义一个unChecked异常,让集成层接口的所有方法都声明抛出这unChecked异常。
定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出Checked异常.