概述
一、Java异常是处理程序中错误的一种机制
Java异常是Java提供的用于处理程序中错误的一种机制
---所谓错误是指在程序运行的过程中发生的一些异常事件。如除0溢出、数组下标越界、所需要读取的文件不存在;
---设计良好的程序应该在异常发生时提供处理这些错误,使得程序不会因为异常的发生而阻断或者产生不可预见的结果;
---Java程序的执行过程中如果出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并经被提交给Java运行时系统,这个过程称为抛出异常throw;
---当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这个过程称为捕获异常。
二、Java异常处理的关键字有throws、throw、try、catch、finally共5个关键字
try:将可能抛出异常的代码放在try语句块之内,当try语句块内发生异常时,异常被抛出。
catch:用于捕获异常。catch用来捕获try语句块中发生的异常。
finally:finally语句块总是会被执行。它主要用于回收在try块里打开的资源。只有finally块执行完后,才回来执行try或者catch块中的return或者throw语句,如finally中使用了return或throw等终止方法的语句,则不会跳回执行,直接停止。
throw:用于抛出异常。
throws:用在方法签名中,用于声明该方法可能抛出的异常。
三、异常处理机制
Java语言提供了异常处理机制,为方法的异常终止和出错处理提供了清楚的接口。
- 用来在发生运行异常时告诉程序如何控制自身的运行,以防止错误的进一步恶化;
- 每个方法必须对他可能抛出的异常进行预先声明,在定义方法时,必须声明这个方法可能会抛出哪一种或几种异常。
Java针对可能出现的问题提供了一组异常类,顶级父类为Throwable
getMessage
toString
printStackTrace
四、异常的分类:
1、Error及其子类:错误,一般指的是虚拟机的错误,是由Java虚拟机生成并抛出,程序不能进行处理所以也不加处理,例如OutOfMemoryError内存溢出、调用栈溢出StackOverFlowError。
2、RuntimeException及其子类:运行时异常(非受检型异常),是由于编程bug所导致,希望越早发现越好,所以不进行处理,直接中断报错即可,编程人员针对报错信息修改程序bug来解决问题。
3、Exception及其子类中除了RuntimeException及其子类之外的其它异常:受检型异常(非运行时异常),这类异常属于明知道可能出现,但是没有办法杜绝的异常。这类异常一般采用try/catch或者throws声明抛出的方式进行异常处理,当程序出现了非正常情况,尽量保证程序正常结果,而不是立即中断。
- 受检型异常:明知道存在这种异常的可能,但是没有办法杜绝,所以必须进行编码异常处理必须进行编码处理,否则编译失败。处理方法有2个try/catch结果或者throws声明抛出;
- 非受检型异常:这种异常不需要进行处理,发现的越早越好可以编码处理,也可以不用处理。
Throwable类是Java异常类型的顶层父类,一个对象只有是Throwable类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别
五、5种常见的运行时异常类型
5.1、ArithmeticException数学异常,/ by zero是异常的说明信息。
int k=0;
System.out.println(10/k);
解决方案:在执行除法计算之前,进行分母是否为0的判断
5.2、ArrayIndexOutOfBoundsException数组下标越界,数组下标的取值范围为[0,length-1]。
int[] arr=new int[5];
System.out.println(arr[5]);
解决方案:通过下标访问数组元素时,首先对数据下标进行范围判断
5.3、NullPointerException空指针异常,针对null对象调用方法。
Object obj=null;
System.out.println(obj.toString());
解决方案:必须保证针对引用类型变量调用方法之前,变量不能为null;否则有可能为空时,先进行null值判断,非空再调用方法String.valueOf(obj)。
5.4、ClassCastException引用类型转换时异常,将变量强制转换为不兼容的类型
Object obj = new Random();
int year=((Date) obj).getYear()+1900;
解决方案:进行强制类型转换之前首先使用instanceof运算符进行类型兼容性的判断
Object obj = new Random();
if (obj instanceof Date) {
int year = ((Date) obj).getYear() + 1900;
}
5.5、NumberFormatException数据格式异常
String str="123a";
int kk=Integer.parseInt(str);
解决方案:进行数据类型转换之前,针对字符串内容进行格式判断,推荐使用正则式。
String str = "123a";
boolean res = true;
for (int i = 0; i < str.length(); i++) {
char tmp = str.charAt(i);
if (tmp > '9' || tmp < '0') {
res = false;
break;
}
}
if (res) {
int kk = Integer.parseInt(str);
System.out.println(kk);
}
六、 异常的捕获和处理
try{
try代码段中包含可能产生异常的代码,有人称为陷阱代码,
在执行过程中如果出现了异常,则异常之后的java语句不会
执行。转而执行catch部分的代码
} catch(SomeException e){ 可以写多个
try后可以跟一个多个catch代码段,针对不同异常执行不同
的处理逻辑。当异常发生时,程序会中止当前的流程,根据获
取异常的类型去执行响应的代码段。注意异常类型判定时是从
上向下逐个判断的。
}finally{
finally代码是无论是否发生异常都会执行的代码
}
6.1、 throws--用在方法签名中,用于声明该方法可能抛出的异常,要求谁调用谁处理这个异常。
主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。
public void pp() throws Exception{}
6.2、try/catch结构的问题:一个try结构后面可以跟无数个catch结构。
try {
ss = sc.nextLine();
age = Integer.parseInt(ss);
} catch (NumberFormatException e) {
//异常类型的判定不是最佳匹配,而是逐一匹配,一旦匹配成功,则不会继续进行匹配
//必须小在前大在后
System.out.println(ss);
System.out.println("数据格式错误!");
} catch (Exception e) {
System.out.println("其它问题!");
}
6.3、允许在catch中声明多个类型。
注意:多个异常类型不要出现父子异常,如果需要写父不写子即可。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int age = -1;
String ss = null;
try {
ss = br.readLine();
age = Integer.parseInt(ss);
} catch (NumberFormatException | IOException e) {
System.out.println("其它问题!");
}
System.out.println(age);
强调:catch只匹配成功一次即可,注意不是最佳匹配。
catch结构中的e是用于指代陷阱代码中的异常对象。
最后
以上就是冷艳书本为你收集整理的Java-------异常处理的全部内容,希望文章能够帮你解决Java-------异常处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复