java之异常

 
 

一、异常

 

    1、定义

在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。
    

    2、异常的结构

 
 

    3、异常的分类

1)错误Error:应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,指虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等
 
2) 受控异常: 这种异常属于一般性异常,出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过。编译器强制普通异常必须try…catch处理,或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。
 
3)非受控异常:非受控异常也即是运行时异常(RuntimeException),这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明
 
    

    4、异常的处理

 
捕获处理 :try--catch
抛出处理 :throws  throw
    

    5、异常的捕获处理

    
    try {
    
    } catch (OneException e) {
    
    } catch (TwoException e) {
    
    } finally {
    
    }
 

    6、异常的抛出处理

throws会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理,JVM然后中断处理
 
     throw 和 throws 的区别?
throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throw一般用于抛出自定义异常。
 
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
throws表示出现异常的一种可能性,并不一定会发生这种异常。
 
 
 

    7、异常的捕获顺序

 
异常的捕获:一般按照由小到大的顺序,也就是先截获子异常,再截获父异常
 
例如:
    将IOException放到前面,会出现编译问题,因为IOException是FileNotFoundException的父类,所以截获了IOException异常后,IOException的子异常都不会执行到,所以再次截获FileNotFoundException没有任何意义
 
 

    8、getMessage()和printStackTrace()

获取异常描述信息
使用异常对象的getMessage()方法,通常用于打印日志时
 
取得异常的堆栈信息
使用异常对象的printStackTrace()方法,比较适合于程序调试阶段
 
 
    

二、自定义异常

    

    1、定义

1)前面所讲的异常,都是系统自带的,系统自己处理
 
2)但是很多时候项目会出现特有问题,而这些问题并未被java所描述并封装成对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义异常封装。
 
3)在Java中要想创建自定义异常,需要继承Throwable或者他的子类Exception。
 

    2、语法

class  自定义异常类 extends 异常类型(Exception){
 
  // 因为父类已经把异常信息的操作都完成了,所在子类只要在构造时,
    将异常信息传递给父类通过super 语句即可。
  // 重写 有参 和 无参  构造方法
}
 

    3、例子

package com.jbrh.pojo;

public class DiYiException extends Exception {


    //无参构造方法
    public DiYiException(){
        super();
    }

    //有参的构造方法,用于存储自定义异常信息
    public DiYiException(String message){
        super(message);
    }

    // 用指定的详细信息和原因构造一个新的异常
    public DiYiException(String message, Throwable cause){
        super(message,cause);
    }


    //用指定原因构造一个新的异常
    public DiYiException(Throwable cause) {
       super(cause);
    }


}

 

    4、第一种自定义测试

package com.jbrh.pojo;

/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {




    //方法一:声明异常数据,并用throws抛出
//    public void say() throws DiYiException{
//
//        throw new DiYiException("我喝酒了"); //new对象自定义异常消息存储在构造方法中
//    }


    //方法二:声明异常数据,并用try 。。catch捕获抛出
    public void say() {

        try {
            throw new DiYiException("我喝酒了");  //new对象自定义异常消息存储在构造方法中
        } catch (DiYiException e) {
          e.printStackTrace();
        }
    }

    //mian方法
    public static void main(String[] args) throws DiYiException {

        DiYiTest test =  new  DiYiTest();
        test.say();

    }

}

 
 

    5、第二种RuntimeException封装测试

 

package com.jbrh.pojo;


/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {


    //方法二:声明异常数据,并用try 。。catch捕获抛出
    public void say() {

        try {
            throw new DiYiException("我喝酒了"); //new对象自定义异常消息存储在构造方法中
        } catch (DiYiException e) {

        //异常 包装成 RuntimeException 异常继续抛出
         RuntimeException exception   =  new RuntimeException(e);
         throw  exception;
        }
    }


    //mian方法
    public static void main(String[] args) throws DiYiException {


        DiYiTest test =  new  DiYiTest();
        test.say();


    }


}

 
 
 

    6、第三种try--catch控制测试

package com.jbrh.pojo;

/**
* @Description
* @Author xinxiaokang
* @Date 2021/4/29 14:28
*/
public class DiYiTest {


    //方法一:声明异常数据,并用throws抛出
    public void say() throws DiYiException{

        throw new DiYiException("我喝酒了");
    }


    public static void main(String[] args) {

        DiYiTest test =  new  DiYiTest();
        try {
            test.say();
        } catch (DiYiException e) {
            System.out.println("异常:"+e.getMessage());
        }

    }

 
 

7、Java checked 异常 和 RuntimeException(运行时异常)

对于异常分两种:检查异常和非检查异常(运行时异常)
 
检查异常 : 编译时被检测的异常 (throw后,方法有能力处理就try-catch处理,没能力处理就必须throws)。编译不通过,检查语法(其实就是throw和throws的配套使用)。
 
运行时异常 : 编译时不被检查的异常(运行时异常。RuntimeException及其子类)。编译通过。
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值