1,从安全的角度来讲,面向过程的异常处理是更为安全的,因为面向过程是事前处理,而面向对象是事后处理。
从编程和理解的角度来讲,面向对象的处理方式更为方便易懂,因为他是正常代码和处理异常分开的,从而使程序具有处理错误的能力。
2,另一方面
面向过程语言错误处理方式是有缺陷的:
1)不进行范围检查(数据范围错误,如数组下标越界)
2)采用if语句进行事先判断以防止出现错误。
3,虽说java也是有他的缺陷但是java还是一门安全的语言:
1)Java语言提供严密的语法规则。
2)Java在编译和运行时严格检查错误。
3)Java提供异常处理机制。
4)Java提供内存自动管理方式。
4,java中的异常和错误
1)错误(error)指程序运行时遇到的硬件或操作系统的错误。 Error错误类
2)异常(exception)指在硬件和操作系统正常时,程序遇到的运行错。 Exception异常类
5,异常和错误的全部分类,继承。
6,几个值得关注的RuntimeException运行异常类:
1)算术异常ArithmeticException:除数为0
2)空对象异常NullPointerException
int a[] = null;
a[0] = 1; //对空数组中的元素进行操作
String str = null;
str.length() //调用空对象的方法
3)类型强制转换异常ClassCastException
Object obj = new Object();
String str = (String) obj;
4)负数组长度异常NegativeArraySizeException
int a[] = new int [-1];
5)数组下标越界异常ArrayIndexOutOfBoundsException
int a[] = new int[1];
a[1] = 1;
6)字符串序号越界异常StringIndexOutOfBoundsException
"abc".charAt(-1)
7)数值格式异常NumberFormatException
int j = Integer.parseInt("abc");
7,程序对错误与异常的三种处理方式
1)程序不能处理错误
2)程序应避免而不捕获的异常,如除数为0、数组下标越界等。
3)必须捕获的异常
8,下面使用一个计算数组平均值的例子解读异常的使用:
public class ArrayAverage {
//需求:求一个整数数组的平均值
public static double average(int table[]){
//方便if判断的要用if处理,如空指针异常、数组长度为0
if(table!=null && table.length!=0){//注意,两个布尔表达式顺序不能颠倒
double sum=0;
for(int i=0;i<table.length;i++){
sum = sum + table[i];
}
return sum/table.length;
}
return 0;
}
//需求: 求两个整数数组的平均值
public static double average(int table1[], int table2[]){
if(table1==null || table1.length==0){
return average(table2);
}
//程序能够运行到这里,说明table1非空,且元素个数大于0
if(table2==null || table2.length==0){
return average(table1);
}
//程序能够运行到这里,说明table1和table2都为非空,且元素个数大于0
int count=table1.length+table2.length;
double sum=0;
for(int x:table1){
sum +=x;
}
for(int x:table2){
sum +=x;
}
return sum/count;
}
//需求: 把一个字符串数组中的整数提取出来,生成一个整数数组返回
public static int[] tointArray(String str[]){
if(str!=null && str.length!=0){
int a[] = new int[str.length];
int i=0,n=0;
while(i<str.length){
try {
a[n]= Integer.parseInt(str[i]);//"12", "abc12"
n++;
}catch (NumberFormatException e) {
System.out.println(str[i]+"不能转换成整数");
}catch (Exception e) {
System.out.println("出现没想到的异常");
}finally{
i++;
}
}
//经过上面的循环,a[]中的前n个数据是有效的,后面的是无效的。
//把有效元素提取成新的数组
int b[] = new int[n];
System.arraycopy(a, 0, b, 0, n);
return b;
}
return null;
}
}