Java

异常(Exception)

2022-02-21  本文已影响0人  马佳乐

在程序设计和运行的过程中,发生错误是不可避免的。

常见异常分类:

语法错(编译错)——syntax error

语义错(运行错)——semantic error(run-time error)

逻辑错——logic error



异常类

Throwable 类是 Java 语言中所有错误或异常的超类。
声明:public class Throwable extends Object implements Serializable

(1)Error类

(2)Exception类(异常类)

(3)RuntimeException类(运行异常类)

常见运行异常:

①算数异常ArithmeticException:

当进行整数除法或取余运算时,如果除数为0,则会产生。

②空对象异常NullPointerException:

当一个数组变量赋值为空引用(null)时,如果对该数组中的运算进行操作;
例如:

int a[]=null;
a[0]=1;l/对空数组中的元素进行操作,产生空对象异常

当一个对象赋值为null时,如果通过该空对象调用方法。
例如:

String str=null;
System.out.printIn(str.length0);//调用空对象的方法,产生空对象异常

③类型强制转换异常ClassCastException:

当进行类型强制转换时,如果遇到不能进行的转换操作;
例如:

Object obj=new Object();
String str=(String)obj;//obj既不是String的实例,也不是其子类的实例,故不能转换,产生异常

④数组下标越界异常ArrayIndexOutOfBoundsException:

当访问数组元素时,如果下标越界,则产生。
例如:

int a[]=new int[1];
a[1]=1;//产生数组下标越界异常

⑤数值格式异常NumberFormatException:

当将字符串转换成整数时,如果给定字符串不符合整数格式。
例如:

int i=Integer.parseInt(123"');//正确,不产生异常
int j=Integer.parseInt(“abc”);//产生数值格式异常

异常处理语句

异常处理语句有五个关键字try、catch、finally、throw和throws。

异常处理的基本结构

try
{
  语句块;//try子句指明可能产生异常的代码段
  }
catch(异常类型1     异常对象1)
{
  异常处理语句块1;//捕获到异常并进行处理的代码
  }
catch(异常类型2     异常对象2)
{
  异常处理语句块2;
  }
...
finally
{
  异常处理结束前的语句块;//最后必须执行的代码,无论是否捕获到异常
  }

异常处理语句的执行过程

①正常情况下(即没有产生异常时)

首先执行try中的语句序列,若没有产生异常则跳过catch子句,再执行finally子句中的语句序列,然后执行继续后面的语句。

②捕获异常并处理

③执行finally子句

public class Test1 {
    public static void main(String[] args) {        
        double num=1;
        try{
            num=1/0;
        }catch(ArithmeticException e){
            e.printStackTrace();
        }finally{
            System.out.println("继续运行其他代码");
        }
    }
}

包含多个catch块的异常处理程序:

public class Test1 {
    public static void main(String[] args) {        
        int a[]={0,0};
        int num=1,result=0;
        String str=null;
        try{
            result=num/0;
            System.out.println(num/a[2]);
            str.charAt(3);
        }catch(ArithmeticException e){          
            System.out.println("Error1=="+e);;
        }catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Error2=="+e);
        }catch(Exception e){
            System.out.println("Error3=="+e);
        }finally{
            System.out.println("继续执行程序");
        }
    }
}

抛出异常的方式

若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在该方法中抛出异常。

(1) 使用throws关键字抛出异常

    类型   方法名(形参表) throws  异常列表
    {     
        代码 
    }

异常列表可用多个异常可使用逗号分隔

public class Pao {
    public static void main(String[] args) {        
        try{
            p();     //方法的直接调用者俘获处理异常
        }   
        catch(ArithmeticException e) { 
            System.out.println("Error: Divider is zero! \n");
        } 
    }
    private static void p()  throws ArithmeticException {
            //间接抛出异常,自己并未处理,让方法的直接调用者来处理
        int  i;  
        i=4/0;   //此句可能引发异常,可是自己并未处理
    } 
}

如果是Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
如:

public class Pao {
    public static void main(String[] args) {
        A a=new A();        
        try{
            a.fun();     //方法的直接调用者俘获处理异常
        }   
        catch(ArithmeticException e) { 
            System.out.println("Error: Divider is zero! \n");
        } 
    }
}
class A extends RuntimeException{
    void fun(){ // 运行时产生的异常被系统抛出
        int i;
        i=4/0;
    }
}

(2)使用throw关键字抛出异常

public static void main(String[] args) {
    try{
        f1(0);
    }catch(ArithmeticException e){
        System.out.println(e.getMessage());
    }
}
static void f1(int i) throws ArithmeticException{
    if(i==0){
        throw new ArithmeticException("被除数为0");
    }
}

自定义异常

public class Self { 
    public static void main(String[] args) {
        try{
            regist(-1);
        }catch(MyException e){
            System.out.println("登记失败");
            System.out.println("原因为:"+e.getMessage());
        }
        System.out.println("操作结束");
    }
    static void regist(int num) throws MyException{
        if(num<0){
            throw new MyException("人数为负值");
        }
        System.out.println("登记人数:"+num);
    }
}
class MyException extends Exception{        
    public MyException(String message) {
        super(message);     
    }       
}
上一篇下一篇

猜你喜欢

热点阅读