异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
异常发生的原因有很多,通常包含以下几大类:
1用户输入了非法数据。
2要打开的文件不存在。
3网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
JAVA语言提供两种异常处理机制:捕获异常和声明抛弃异常
1)捕获异常:在Java程序运行过程中系统得到一个异常对象是,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
2)声明抛弃异常:当Java程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃异常。声明抛弃异常是在一个方法声明中的throws子句中指明的。
下面将通过若干个例子说明JAVA中异常处理机制
Java程序出现异常的不同情况
1.Throwable(异常最顶端的类)
Error(服务器崩溃 数据库崩溃)
Exception(异常类)
RuntimeException(运行时异常)
下面是几种常见的异常
//NullPointerException 空指针异常
//ArrayIndexOutOfBoundsException 数组角标越界异常
//ArithmeticException 算数异常
//ClassCastException 类型转换异常
处理异常
try......catch.....finally
try 指测试异常代码
catch 指捕获异常信息
finally 指异常结束后要做的是什么
try...catch捕获异常的流程
1.函数中 某句代码发生异常
2.发生异常 就产生了对应的 异常对象
3.这个对象返回给 调用者
情况1: 没有对异常进行处理 这时就会把异常
交给JVM去处理 JVM使用了默认的处理机制
情况2: 调用者进行了异常处理(try...catch)
这时返回的异常对象 会跟catch进行匹配
匹配成功执行catch中的语句
程序继续运行
2.处理空指针/角标越界/算数异常
public static void main(String[] args) {
int[] array = new int[4];
try {
//报的异常 产生越界异常的对象
//System.out.println(array[5]);
array = null;
System.out.println(array[1]);
System.out.println(10 / 0);
//注意: 如果catch中要写Exception 来捕获异常
//要放到最下面 并且 catch中的异常要从小到大写
}catch(ArrayIndexOutOfBoundsException e) {
//在匹配catch的时候 有一个被匹配上
//其他的catch 就不会再匹配了
System.out.println("你越界了");
}catch(NullPointerException e) {
System.out.println("你空指针了");
}catch(ArithmeticException e) {
System.out.println("你除0了");
}
catch(Exception e) {
System.out.println("你写错代码了");
}
System.out.println("执行没有?");
}
3.出现异常与否 不会影响finally的执行
也就是说finally一定会执行
finally的作用:一般用来关闭资源 关闭流 关闭数据库
public static void fun() {
try {
System.out.println(10 / 2);
//即使你直接return方法 finally也会执行
//直接关闭JVM虚拟机关了就不执行了
//System.exit(0); 关闭虚拟机
return;
} catch (Exception e) {
System.out.println("你除0了");
}finally {
System.out.println("一定会执行");
}
System.out.println("执行了吗?");
}
4继承重写
class Father{
public void fun() {
}
}
//如果父类没有抛出编译异常 子类能不能抛出编译异常?
//父类没有抛出异常 子类一定不能抛
//如果在子类重写父类方法中 调用了一个有异常的方法怎么办?
//这时只能选择try...catch处理 不能抛出了
//如果父类有抛出编译异常 子类能不能抛出编译异常?
//子类可以不抛出异常 也可以抛
class Son extends Father{
@Override
public void fun() {
try {
method();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//带异常的方法
public void method() throws Exception{
}
}