Java异常
1、Java异常概念
Java语言中的异常处理包括声明异常、抛出异常、捕获异常和处理异常四个环节。
throw用于抛出异常。
throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异常对象。
try是用于检测被包住的语句块是否出现异常,如果有异常,则抛出异常,并执行catch语句。
cacth用于捕获从try中抛出的异常并作出处理。
finally语句块是不管有没有出现异常都要执行的内容。
2、Java异常种类
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
1、运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
ClassCastException(类转换异常)
ClassNotFoundException
IndexOutOfBoundsException(数组越界异常)
NullPointerException(空指针异常)
ArrayStoreException(数组存储异常,即数组存储类型不一致)
还有IO操作的BufferOverflowException异常
2、非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
IOException
SqlException
例1:
关于异常的编程,以下描述错误的是:(A )
- 在有除法存在的代码处,为了防止分母为零,必须抛出并捕获异常
- int i=Integer.parseInt(”123a”);将产生NumberFormatException
- int a[]=null; a[0]=1; 将产生NullPointerException
- 输入输出流编程中,读和写时都要抛出IOException
解析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCKoBjwu-1569919306242)(E:\flyeat\我的小心得\md文件图片\java异常.png)]
a选项中的异常明明可以避免,所以就不用来捕获
b选项可以明显看到字符串不是纯数字,转换成int类型,是要抛出异常的!
c数组定义的就是null,还怎么来赋值!
d还有其他的
3、异常中有finally的运行顺序
-
不管有没有出现异常,finally块中代码都会执行;
-
当finally里面没有return语句时,执行try 和finally语句之后最后再执行return(finally块中语句会先于try中return语句执行);
-
若finally中没有return但改变了要返回的值则:
a、若return数据是基本数据类型或文本字符串则在finally中对该值的改变不起作用,try中的return依然会返回进入finally块前的值,
b、若return数据是引用数据类型,而在finally中对该引用数据类型属性值改变起作用,try中的return语句返回的就是在finally中改变后的属性值
-
若finally中有return语句,则会将try中的return覆盖掉直接执行finally中的return(不建议在finall中return,容易丢失异常)
例1
以下代码执行的结果显示是多少(B)?
public class Demo{
public static void main(String[] args){
System.out.print(getNumber(0));
System.out.print(getNumber(1));
System.out.print(getNumber(2));
System.out.print(getNumber(4));
}
public static int getNumber(int num){
try{
int result = 2 / num;
return result;
}catch (Exception exception){
return 0;
}finally{
if(num == 0){
return -1;
}
if(num == 1){
return 1;
}
}
}
}
- A.0110
- B.-1110
- C.0211
- D.-1211
解析:try,catch,finally中:
num=0,捕获异常,执行catch语句,catch中返回0,执行finally语句,finally语句中返回-1,于是返回finally中的-1;
num=1,try中返回2,执行finally语句,finally语句中返回1,于是返回finally中的1;
num=2,try中返回1,执行finally语句,finally语句中没有返回,于是返回try中的1;
num=4,try中返回0,执行finally语句,finally语句中没有返回,于是返回try中的0.