第九章 异常处理

文章详细介绍了Java中的异常处理机制,包括异常概述、异常的抛出与捕获、常见异常类、自定义异常以及运行时异常。通过示例代码展示了如何使用try-catch-finally结构来处理异常,强调了异常处理的原则和在方法中抛出异常的方式。
摘要由CSDN通过智能技术生成

异常处理分为七种类型

异常概述,异常的抛出与捕捉,java常见的异常类,自定义异常,在方法钟抛出异常,运行时异常,异常的使用原则

9.1异常概述
在程序中,异常可能由程序员没有预料到各种情况产生,也可能超出了程序员可控范围的环境因素影响,如用户的坏数据,试图打开一个根本不存在的文件等 。在java中,这种在程序运行时可能出现的一些错误为异常。异常是一个在程序执行期间发生的时间,他中断了正在执行的程序的正常指令

如下例题9.1  可以作为除数么?
package 第九章;
 
public class Baulk {//类名
 
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        int result =3/0;//定义一个int类型的变量并复制   除数不能为零
        System.out.println(result);//将变;
    }
}

运行结果

9.1捕获异常代码

package 第九章;
 
public class Baulk {//类名
 
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        try {
        int result =3/0;//定义一个int类型的变量并复制   除数不能为零
        System.out.println(result);//将变;
        }catch(ArithmeticException e) {
            System.out.println("捕捉到算法异常");
        }finally {
            System.out.println("程序结束");
        }
    }
}

结果

 

 9.2  异常的抛出与捕捉
为了保证程序有效地执行,需要对抛出的异常进行相应的处理。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,而后处理该异常,也可以将该异常向上抛出,交由方法调用者来处理

9.2.1抛出异常

异常抛出后,如果不做任何处理的话,程序就会被终止,例如将一个字符串转换为整型 ,可以通过lnteger类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将会出现异常提示,实例代码如下;

抛出异常

package 异常;
 
public class Thundering {//创建类
 
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        String str ="lili";//定义字符串
        System.out.println(str+"年龄是:");//输出提示信息
        int age =Integer.parseInt("20L");//数据类型转换
        System.out.println(age);//输出age
    }
}

结果

捕捉异常和抛出异常

代码

package 异常;
 
public class Thundering {//创建类
 
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        try {
        String str ="lili";//定义字符串
        System.out.println(str+"年龄是:");//输出提示信息
        int age =Integer.parseInt("20L");//数据类型转换
        System.out.println(age);//输出age
    }catch(NumberFormatException  e) {//捕捉异常
        System.out.println("捕捉到算法异常");
    }finally {
        System.out.println("程序结束");//输出
        }
    }
}

结果

9.2.2捕捉异常

Java 语言的异常捕获结构由try、catch和finally3部分组成。其中,try语句块存放的是可能发生异常的 Java 语句;catch 语句块在 try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论 try语句块中的代码如何退出,都将执行 finally 语句块。语法如下:
 

try{
1/程序代码块
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
catch(Exceptiontype2e){
1/对Exceptiontype2的处理
 
finally{
        //程序代码快
}

通过异常处理器的语法可知,异常处理器大致分为 try-catch 语句块和 finally语句块

try-catch语句块

下面将例题9.2中的代码进行修改

代码

package 异常;
 
public class Take {//创建类
 
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        try {//try语句块中包含了可能出现异常的程序代码
            String str="lili";//定义字符串变量
            System.out.println(str+"年龄是:");//输出
        int age =Integer.parseInt("20L");//数据类型转换
        System.out.println(age);//
        }catch(Exception e) {//catch语句快中用来获取异常信息
            e.printStackTrace();//输出异常性质
        }
        System.out.println("program voer");//输出信息
    }
 
}

结果

从以上代码和图片所述,可以看出程序仍然输出最后的提示信息,没有应为异常而终止,在上面代码图中,将可能出现异常的代码快用try-catch语句快进行处理,当try语句块中的语句发生异常时,程序就会跳转到catch语句块中执行,执行完catch语句块中的程序代码后,将继续执行catch语句块后其他代码,而不会执行try语句块中发生的异常语句后面的代码。由此可知,Java的异常处理时结构化的 ,不会应为一个异常影响整个程序的执行

finally语句块

完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try_catch

语句快是否顺利执行finally语句。但是,在以下4中特殊情况下 finally快不会被执行

1.在finally语句块中发生异常

2.在前面的代码中使用System.exit()退出程序

3.程序所在的线程死亡

4.关闭cpu

9.3 java的常见的异常类

在java中,提供了一些二机场了用来描写经常发生的异常,其中,有的需要程序员来进行捕获处理或声明抛出,有的是有java虚拟机自动进行捕获处理

9.4自定义异常
使用java内置的异常类可以描述在变成时出现的大部分异常情况。除此之外用户只需要继承Exception类即可自定义异常类。在程序中使用自定义异常类大体可分为以下几个步骤

1.创建自定义异常类

2.在方法中通过throw关键字抛出异常对象

3.如果在当前抛出异常的方法中处理异常,可以使用 try_catch语句快捕获并处理否则在方法的声明出通throws关键字知名要怕出给方法调用者异常,继续进行下一步操作

例题9.4如何创建自定义异常

代码

package 异常;
 
public class MyException extends Exception{//创建自定义异常,继承Exception类
    public MyException (String ErrorMessage) {//构造方法
        super(ErrorMessage);///父类构造方法
    }

例题9.5自定义异常的抛出和捕捉

package 异常;
 
public class Tran {//创建类
    static int avg(int number1,int number2)throws MyException{//定义方法  抛出异常
        if(number1< 0 ||number2<0) {//判断方法中参数是否满足指定条件
            throw new  MyException("不可以使用负数");//错误信息
        }
        if(number1>100 ||number2>100) {//判断方法中参数是否满足指定条件
            throw new  MyException("数值太大了");//错误信息
        }
        return (number1+number2)/2;//将参数的平均值返回
        }
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        try {//try语句块处理可能出现的异常代码
            int result=avg(-1,5);//调用avg()方法
            System.out.println(result);//将avg()方法的返回值输出
        }catch(MyException e) {
            System.out.println(e);//输出异常信息
        }
    }
 
}

结果

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

9.5.1使用throws关键字抛出异常

throws关键字通常被应用重载声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号隔开

例题9.6指明异常起源于何处

代码

package 异常;
 
public class Shoot {//创建类
    static void pop()throws NegativeArraySizeException{//定义方法并抛出异常
        
        int[]arr=new int[-3];//创建数组
    }
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        try {//try语句处理异常信息
            pop();//调用方法
        }catch (NegativeArraySizeException e) {
            System.out.println("pop()方法抛出的异常");//输出异常
            
        }
    }
 
}

结果

 从例题9.6的运行结果所示

使用throws关键字将异常抛给上一级后,如果不象处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码

9.5.2 使用throw关键字抛出异常

throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止它后面的语句都不执行,通过throw抛出异常后,如果想在上一级的代码中捕获并处理异常则需要在抛出异常的方法中使用throw关键字在方法的声明中指明抛出的异常;如果要捕捉throw抛出的异常,则必须使用tryu-catch语句 throw通常用来抛出用户自定义异常下面介绍throw的用法

例题9.7创建自定义异常

代码

package 异常;
 
public class MyException extends Exception{//创建自定义异常,继承Exception类
    String message;//定义一个字符串类型变量
    public MyException (String ErrorMessage) {//构造方法
        message = ErrorMessage;///父类构造方法
    }
    public String getMessage() {//覆盖getMessage
        return message;
    }

例题9.8  使用throw关键字波卓自定义异常

代码

package 异常;
 
public class Captor {//创建类
    static int quotient(int x,int y)throws MyException{//定义方法抛出异常
            if(y<0) {//判断是否小于0
                throw new MyException("除数不能为0");//异常信息
            }
            return x/y;//返回值
    }
    public static void main(String[] args) {//主函数
        // TODO Auto-generated method stub
        try {///try语句块包含可能发生的语句
            int result =quotient(3,-1);//调用方法quptient()
        }catch(MyException e) {//处理自定义异常
            System.out.println(e.getMessage());//输出异常信息
        }catch(ArithmeticException e) {//处理ArithmeticException
            System.out.println("除数不能为0");//输出提示信息
        }catch(Exception e){//处理其他异常
            System.out.println("程序发生了其他的异常");//输出提示信息
        }
 
    }
 
}

结果

捕捉异常,如果调用quotient(3,-1)的方法,将发生的MyException异常,程序跳转到catch(MyException)语句中执行;如果调用quotient(5,0)方法,会发生Arithmeti-cException异常,程序跳转catch(Arithmeti-cException e)语句块中执行,如还有其他异常发生,将使用catch(Exception e)捕捉异常。由于Exception时所有异常类的父类,如果将catch(Exception e)语句块放在其他两个语句块的前面,后面的语句块将永远得不到执行,也就没有什么意义了,所以catch语句的顺序不可调换

9.6运行时异常
RuntimeException异常是程序运行过程中抛出的异常。java类库的每个包中都定义了异常类所有这些类都是Throwable类的子类Throwable类派生了两个子类,分别时Exception类和Error类Error类即其子类来描述java运行系统中的内部错误以及资源耗尽的错误,这类错误比较重要Exception类称为非致命性类,可以通过捕捉处理实用程序继续执行Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常

9.7异常的使用原理
java异常强制用户去考虑程序的强建性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕捉程序在运行时发生的一场并进行相应的处理,编写代码处理某个方法可能出现异常时可遵循的一下几条原则

1.当前方法声明中使用try_catch语句捕捉异常

2.一个方法被覆盖,覆盖他的方法必须抛出先相同的异类或异类的子类

3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新的异常

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值