Java异常

一.异常

1.概念

代表程序出现的问题

2.体系

Error:代表系统级别错误(属于严重问题) 

            系统一旦出现问题,sum公司会把这些封装成Error对象。

Exception:叫作异常,代表程序可能出现的问题,我们通常会用Exception以及他的子类来封装程序出现的问题。

运行时异常:RuntimeException及他的子类 ,编译阶段不会出现异常提醒,运行时出现的异常,一般都是由于参数传递错误带来的问题。(如:数组索引越界异常)

编译时异常:编译阶段就会出现异常提醒的,没有继承RuntimeException,直接继承Exceotion,必须手动处理,否则代码报错,除了RuntimeException及子类,其他都是编译时异常。(如:日期解析异常) 

3.作用

  • 异常是用来查询bug的关键参考信息
  • 异常可以作为方法内部的一种特殊的返回值。以便通知调用者底层的执行情况 
//第二个作用的示例
public void setAge(int age){
        if( age < 18 || age > 40)
            throw new RuntimeExpection();
            }else{
                this.age = age;
    }
}

 二.异常的处理方式

1.JVM默认的处理方式

  • 把异常的名称,异常原因及异常出现的位置等信息输出在控制台。
  • 程序停止执行,异常下面的代码不会再执行了。

 2.捕获异常

自己处理,不让程序停止,多写在方法调用处。

 2.1格式

        try{
            可能出现异常的代码
        }catch(异常类名 变量名){
            异常处理的代码;
        }finally(

                一定会执行的代码

        }

int[] arr = {1,2,3,4}
try{
    System.out.println(arr[10]);
    }catch(ArrayIndexOutofBoundException e){
    System.out.println("索引越界了");
    }finally{
     System.out.println("一定被执行");
}
    System.out.println("有没有执行");

 解释说明:

  1. 当可能出现异常代码的地方出现了异常,程序就会在那创建一个ArrayIndexOutofBoundsException对象:new ArrayIndexOutofBoundsException()。
  2. 拿着这个对象到catch中的小括号中对比,看括号中的变量是否可以接受这个对象。
  3. 如果能被接收,就表示该异常被捕获(抓住),执行catch里面对应的代码。
  4. 当catch里面所有代码执行完毕,继续执行try……catch体系下面的其他代码。
  5. 被finall控制的语句一定会执行,除非JVM退出。
  6. finally可写可不写

接口:AutoCloseable(JDK7后推出的)

特点:在特定的情况下,可以自动释放资源 

注:只有实现了AutoCloseable接口的类才能在小括号中创建对象

  • 基本做法

//手动释放资源
try{
    可能出现异常的代码;
    }catch(异常类名 变量名){
    异常的处理代码;
    }finally{
    执行所有资源释放操作;
}

  • JDK7方案

//资源用完最终自动释放
try(创建流对象1;创建流对象2;){
    可能出现异常的代码;
    }catch(异常类名 变量名){
    异常的处理代码;
    }

  • JDK9方案

//资源用完最终自动释放
创建流对象1;
创建流对象2;
try(流1:流2){
可能出现异常的代码;
    }catch(异常类名 变量名){
    异常的处理代码;
    }

 

2.2.try……catch可能遇到的四个问题 
  • try中没有遇到问题时

        会把try里面所有的代码全部执行完毕,catch里面的代码不会执行。

  • try中遇到了多个问题时

        写多个catch与之对应。

   注:

  1.  如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下   面,避免出现有问题捕获不到的现象(原因:多态)。
  2. 在JDK7之后,如果多个异常的处理方式是一样的,可以在catch中捕获多个异常,中间用 | 隔开
  • try中遇到的问题没有被捕获

        书写的try……catch无作用,最后交给虚拟机处理。

  • try中遇到了问题

        try下面的其他代码不会执行,会直接跳到对应的catch当中,没有匹配的catch,会交给虚拟机处理。

 2.3.Throwable的成员方法
方法名称说明
public String getMessage()返回此throwable的详细消息字符
public String toString()返回此可能抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

 注:printStackTrace()方法仅仅只是打印信息,程序不会停止运行,下面的代码还是会执行。

3.抛出异常

3.1throws

概述:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。

//格式
Public void 方法() throws 异常类名1,异常类名2……{}

 注:

  • 编译时异常(代码错误),必须要写
  • 运行时异常(参数错误),可以不写
3.2throw
  • 写在方法内,结束方法。
  • 手动抛出异常对象,交给调用者。
  • 方法中下面的代码不再执行。
//格式
public void 方法(){
    throw new NullPointException();
}

 三.自定义异常

1.步骤

  1. 定义异常类
  2. 写继承关系
  3. 空参构造
  4. 有参构造

2.意义 

为了让控制台的报错信息更加见名知意。

3.示例 

public class NameFormatException extends RuntimeException{
    public NameFormatException() {};
    public NameFormatException(String message){
        super(message);
    }
}

命名技巧

  • NameFoemat当前异常名字,表示名字格式化问题,见名知意。 
  • Exception表示当前异常类型。

注:

  • 运行时(RuntimeException)一般来说是表示由于参数错误而导致的问题。
  • 编译时(Exception)提醒程序员检查本地信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值