目录
Java异常处理机制
异常是指程序运行过程中出现的非正常现象,例如除法中除数为0、用户输入错误和数组下标越界等等,所以好的程序可以尽可能的来预见并处理这些异常。计算机系统处理异常的方式通常有两种方法:计算机系统本身直接检测程序中的错误并终止程序报错;由程序员在程序中加入处理异常的功能。
Java提供了功能强大的异常处理机制,可以方便的在程序中监视可能发生异常的程序块并将所有异常处理代码集中放置在程序某处,使完成正常功能的程序代码与进行异常处理的程序代码分开。
在Java中将异常情况分为Exception和Error两类。Exception类解决由程序本身以及环境所产生的异常,而Error类则处理较少发生内部系统错误。Exception类异常可以被捕获并进行相应的处理,而Error类则没有办法。Exception和Error类又包含许多子类,继承图如下:
异常处理方式
Java处理异常的方式有2种:一种是使用try-catch-final结构对异常进行捕获和处理;另一种是通过throws和throw抛出异常。
1.try-catch-final结构
使用try-catch-final结构对异常进行捕获和处理的格式如下:
try{
//可能出现的异常出现代码
}
catch(异常类名 异常对象名){
//异常类名对应的异常处理代码
}
finally{
//必须执行的代码
}
需要注意的是将可能发生异常的程序代码放在try程序块中,如果这一块的程序代码
2.抛出异常
抛出异常语句
一般情况下程序的异常是由系统自动捕获的,但是在Java中程序员可以自己通过throw语句抛出异常。throw的语句格式是:throw new 异常类名()
。其中,异常类名是系统的异常类名或者是用户自定义的异常类名,而信息就是一段输出的语句,当返回后是会显示出来的。
public class Exception{
public static int sum(int n){
if(n<0){
throw new IllegalArgumentException(); //设置应该抛出异常的的代码块
}
int s = 0;
for(int i=n;i<=n;i++){
s=s+i;
}
return s;
}
public static void main(String[] args){
int a = 5;
sum(a); //调用成功,不会抛出异常
int b = -10;
try{
sum(b); //调用失败,会抛出异常
}
catch(IllegalArgumentException e){ //捕获抛出的异常
System.out.println("异常信息");
}
}
}
抛出异常选项
如果一个方法没有捕获到可能发生的异常,应该调用该方法的其他方法捕获并处理该异常。为了明确指出一个方法不捕获某类的异常而让该方法的其他方法捕获到该类的异常,可以在声明方法的时候使用throws语句来抛出该类的异常,使用格式如下:
[修饰符] 类型标识符 方法名([参数表]) throw 异常类型名{
声明部分;
语句部分;
}
举例来说:
public class Exception{
public static int sum() throws NegativeArraySizeException{
int s = 0;
int[] x = new int[-4]; //错误的数组创建,将会触发异常,但是sum()不对该异常捕获和处理
for(int i=0;i<4;i++){
x[i] = i;
s=s+x[i];
}
return s;
}
public static void main(String[] args){
try{
System.out.println(sum());
}
catch(NegativeArraySizeException e){ //捕获抛出的异常
System.out.println("异常信息");
}
}
}
3.自定义异常类
在我们程序设计的过程中会出现各种各样的问题异常,有一些可以通过Java系统预定义·的异常类来处理,但还有一些不能通过Java系统的已有类来解决问题,在此情况下可以自己定义异常类来处理,自定义异常类可以通过继承Exception类实现,它的一般形式是:
class 自定义异常类名 extends Exception{
异常类体;
}
举例来说:
class OverFlowException extends Exception{ //自定义异常类
OverFlowException(){
System.out.println("此处有数据溢出");
}
}
public class Exception{
public static int x = 100000;
public int multi() throws OverFlowException{
int aim;
aim = x*x*x;
if(aim>1.0E8||aim<0){
throw new OverFlowException(); //如果溢出则抛出异常
}
else{
return x*x;
}
}
public static void main(String[] args){
int y;
try{
y=multi();
System.out.println("y="+y);
}
catch(OverFlowException e){ //捕获异常并输出“此处哟数据溢出”
System.out.println(e); //输出异常类名
}
}
}