1. java异常的基础知识
首先介绍java的异常体系结构(来自网络)
Throwable 类是 Java 语言中所有错误或异常的超类。Error 是程序无法处理的错误,表示运行应用程序时出现的比较严重的问题。表示代码运行时JVM出现的问题。包括动态链接失败,虚拟机错误等。程序对其不做处理。而Exception是程序本身可以处理的异常,又分为编译时异常和运行时异常。编译时异常是编辑器要求必须处理的异常,可以用try-catch语句捕获它,或者用throws子句声明抛出它。
运行时异常:都是RuntimeException类及其子类异常,如:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
不能加载所需的类 ClassNotFoundException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组下标越界异常:ArrayIndexOutOfBoundsException
字符串转换为数字异常:NumberFormatException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
方法未找到异常:NoSuchMethodException
这些异常一般是由程序逻辑错误引起的,其特点是java编辑器不会检查它,总是由虚拟机接管。出现运行时异常后,如果没有捕获并处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。
2.异常处理机制
捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它 的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
对于可能出现异常的代码,有两种常用的处理办法:
第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。
try{
//包含可能会出现异常的代码以及声明异常的方法
}catch (ClassCastException e) {
//捕获指定异常并进行处理
}catch(ExceptionName e1){
//捕获指定异常并进行处理
}finally{
//必须执行的代码(如关闭资源)
}
注意:
try语句不能单独存在,可以和catch,finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,finally中的代码块无论是否出现异常都会执行。try、catch、finally这三个关键字均不能单独使用。不能在 finally 块中使用 return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。即finally中的return 会覆盖 try 或者catch中的返回值。
public static void main(String[] args)
{
int re = bar();
System.out.println(re);
}
private static int bar()
{
try{
return 8;
} finally{
System.out.println("finally");
}
}
/*输出:
finally
*/
好多人认为try-catch语句是放在一起不能省略的。其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。
切记:catch和finally语句不能同时省略!!!
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的
4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:
}
public static double method(int value) {
if(value == 0) {
throw new ArithmeticException("参数不能为0"); //抛出一个运行时异常
}
return 10 / value;
}
throw和throws的区别:
1.throws出现在函数头,throw出现在方法体。throws在方法的声明处抛出一个异常,而throw是在方法体内抛出一个异常对象。
2.throw,如果执行了,那么一定是抛出了某种异常了,而throws表示可能出现,但不一定。
自定义异常
如果自定义异常,只需要继承Exception类即可。
package com.dsx.exception;
public class MyException extends Exception{
private String msg;
private String code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public MyException() {
super();
}
public MyException(String message,String code) {
super();
this.msg = message;
this.code = code;
}
}
如有不足,欢迎留言指正。望不吝赐教。。。