异常
什么是异常?顾名思义就是错误啊(废话,你怎么整天说废话…),额,其实异常也确实就是这个意思。首先,你的代码不能保证百分百是对的,你也不能保证用户输入的的内容一定是规范的,你也不能保证这个设备一定是可以使用的,你更加不能保证这一段数据在处理的时候又可能会发生多少种错误也就是异常,所以我们程序代码里面就有了异常这个机制。然后我们在处理相关有可能会出错的代码的时候就会监听所谓的异常,当异常发生的时候我们就会单独去处理异常,或者抛出异常给用户并且提示错误。异常发生的一部分可能:
- 用户输入错误
- 设备错误
- 物理限制
- 代码错误
异常的分类
异常对象都是派生于Throwable类的一个实例,书中给了大概以下这些分类:
- 错误的类型转换
- 数组访问越界
- 访问空指针
- 视图在文件尾部后面读取数据
- 视图打开一个不存在的文件
- 视图根据给定的字符串查找Class对象, 而这个字符串表示类并不存在
捕获异常
使用try catch两个关键字来捕获异常,也就是保护代码:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
上面的代码一旦,try里面的代码块,一旦发生了错误,就会马上终止后面的代码,执行catch里面的代码,如果try里面的代码没有发生错误就会执行完里面的代码,并跳过catch里面的代码继续往下执行。这就是一个简单的异常捕获。
异常还可以同时捕获多个:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
上面的catch,同时只会触发一个,因为一旦发生其中一个错误,马上就到catch里面去了,后面有异常也捕获不到了,所以只会触发一个。捕获异常的时候,还有可能会发生异常进入到了catch中,但是确还没有释放内存,清空某些变量,这种时候往往后面的代码可能就不会执行了,所以我们就需要 finally子句,finally子句就可以让我们在任何情况下都必须执行,这种时候我们就可以在finally子句里面去释放我们需要释放的资源和内存了。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
最后一种情况,就是当你这个方法里面的异常不想在这个类里面处理的时候,要抛出去在别的类里面处理的时候,就需要用到throws/throw关键字了:
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}