`

异常的理解

阅读更多

具体问题、具体分析、没有万能的准则。糊涂,不知道对错,但在思考,时间会验证自己曾经的思考。

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异常.

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics