JavaSE: 异常的避免与捕获
异常的避免:
尽量使用if条件判断来避免异常的发生
这样做的缺点:
代码臃肿,可读性差
示例:
class ExceptionPreventTest{
main(){
// 算术异常
int ia = 10;
int ib = 0;
if ( 0 != ib){
print(ia / ib);
}
// 数组下标越界异常
int[] arr = new int[5];
int pos = 5;
if( pos >= 0 && pos < 5){
print(arr[pos]);
}
// 空指针异常
String str = null;
if (null != str){
print(str.length());
}
// 类型转换异常
Exception ex = new Exception();
if (ex instanceof IOException){
IOException ie = (IOException) ex;
}
// 数字格式异常
String str2 = "123a";
if (str2.matches (\\d+)){
print(Integer.parseInt(str2));
}
print("程序总算正常结束了!")
}
}
异常的捕获
语法格式:
try{
编写可能发生异常的代码
}catch(异常类型 引用变量名){
编写针对该类异常的处理代码
}
...
finally{
编写无论是否发生异常都要执行的代码
}
示例:
class ExceptionCatchTest{
main(){
// 创建一个FileInputStream类型的对象与 d:/a.txt 文件关联,打开文件
FileInputStream fis = null;
try{
print "1";
// 当程序执行过程中发生了异常后,直奔catch分支进行处理 ("2" 不会执行)
fis = new FileInputStream("d:/a.txt");
print "2";
}catch (FileNotFoundException e){
print "3";
e.printStackTrace();
print "4";
}
// 关闭文件
try{
print "5";
fis.close();
print "6";
} catch (IOException e){
print "7";
e.printStackTrace();
print "8";
} catch (NullPointerException e){
e.printStackTrace();
}
}
}
手动处理异常和没有处理的区别:
代码是否可以继续向下执行
注意事项:
<1>catch (Exception e){
e.printStackTrace();
}
不推荐这样的写法,因为可读性差
<2> 在异常捕获时,小Exception的类型 需要放在 大Exception类型的前面