一、常见的异常操作
在Java提供了大量的异常类,这些都来自于Java.lang.Throwable类。Throwable有两个直接子类,其中Error代表程序中产生的错误,Exception代表程序的产生的异常。
1.Error
该类成为错误类,是JVM错误,它表示Java运行时产生的系统内部错误,或者资源耗尽的情况。
a.通过java运行一个不存在的类就会出现Error错误-即虚拟机无法找到-itcast这个类
b.有时出现递归是,由于垃圾回收的原因,可能会出现内存耗尽的情况,即StackOverflowError,即栈空
2.Exception
该类成为异常类,它代表程序本身可以处理的错误,在开发Java程序中进行的异常处理。父类均为-Exception,在其众多子类中,有一个特殊的RuntimeException类,除此类外,Exception的其它所有子类,都用于表示编译时异常。
二、异常捕获
程序出现异常,就会停止运行。java中提供一种对异常的处理方式-异常捕捉,通常使用try...catch语句。
具体格式如下:
1 try{ 2 //程序代码块 3 }catch(ExceptionType(Exception类即其子类)){ 4 //对ExceptionType的处理 5 }
其中try代码块中编写的可能发生异常的Java语句,catch代码块中编写针对异常进行处理的代码块
1 public class example21 { 2 3 public static int divide(int x,int y){ 4 int result=x/y; 5 return result; 6 } 7 public static void main (String [] args){ 8 try{ 9 int result=divide(4,0); 10 }catch(Exception e){ 11 System.out.println("捕捉的异常信息为"+e.getMessage()); 12 } 13 System.out.println("程序继续向下运行......"); 14 } 15 16 }
程序的运行结果是:
捕捉的异常信息为/ by zero
程序继续向下运行......
这里我们可以得到两个信息,一个是,try{}catch(){}捕获到了异常,
且将参数e传递给catch代码块;
且try中的代码块捕获到了异常后,以后的代码块是不会继续运行的
try{}catch()之后的代码块可以继续运行。
try代码块中,一旦捕获到了异常,其后面的程序不会继续执行
如果要程序是否发生异常都要继续执行,可以在try...catch语句后面加入一个finally代码块
1 public class example22 { 2 3 public static int divide(int x,int y){ 4 int result=x/y; 5 return result; 6 } 7 public static void main (String [] args){ 8 try{ 9 int result=divide(4,0); 10 }catch(Exception e){ 11 System.out.println("捕捉的异常信息为"+e.getMessage()); 12 //return; 13 }finally{ 14 System.out.println("进入finally语句块"); 15 } 16 System.out.println("程序继续向下运行......"); 17 } 18 19 }
程序运行结果
捕捉的异常信息为/ by zero
进入finally语句块
从结果可知,并没有执行System.out.println("捕捉的异常信息为"+e.getMessage());这一语句
且没有执行System.out.println("程序继续向下运行......");代码块?
在catch中加入return代码块后,会结束之前的方法,可是finally会继续执行
如果要返回结果,不要在try...catch语句块中返回,否则下面的程序会执行不了
可以把return注释后,发现finally代码块会继续运行
try...catch语句执行 System.exit(0)时,finally语句块不会运行。
System.exit(0)表示,退出当前的虚拟机。
三、throw关键词
针对代码块无法判断是否会发生异常时,java中允许在方法的后面使用throws关键词对外申明
该方法可能发生的异常
throws关键词的抛出异常的语法格式为
修饰符 返回值类型 方法名 ([参,参数2....])throws ExceptionType1,[,ExceptionType2...]
我们发现 divide 会出现错误
1.可以继续抛出错误--抛出不是处理
继续使用throws抛出
会执行代码System.out.println("进入代码...");
而异常后面的代码不会执行
抛出后不会执行以后的代码,程序会非正常停止
2.可以用try...catch对错误进行处理
使用代码块try...catch处理错误
在try...catch代码块依旧可以运行
1 public class example23 { 2 //实现两个整数相除,并使用throws关键字声明抛出异常 3 public static int divide(int x,int y)throws Exception{ 4 int result=x/y; 5 return result; 6 } 7 public static void main (String [] args) { 8 System.out.println("进入代码..."); 9 int result = 0; 10 try { 11 result = divide(4,0); 12 } catch (Exception e) { 13 // TODO Auto-generated catch block 14 e.printStackTrace();//打印捕获的异常信息 15 } 16 System.out.println(result); 17 System.out.println("退出代码..."); 18 } 19 20 }
四.Java的异常分类
1.运行时异常--非检查异常
RuntimeException类及其子类都是运行时异常。
运行时异常的特点是Java编译器不会对其检查,
即没有try..catch语句捕获或使用throws关键字声明抛出,程序也能正常编译通过
常见的该类异常有: 越界--ArrayIndexOutBoundException
空指针--NullPointterException
2.编译时异常--检查异常
除了RuntimeException类及其子类都是检查异常
运行时异常的特点是Java编译器不会对其检查
处理编译时期的异常有两种方式,
a.使用try...catch语句对异常进行捕获;
b.使用throws关键字声明抛出异常,调用者对其处理
五.异常信息分析
在非检查异常时,可以配合异常信息和输出来处理