异常的分类及处理方法

java.lang.Throwable是所有错误、异常的父类

其子类包含:

  • Error:工程师无法处理,只能尽量避免。

  • Exception:异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。

1、Check Exception

编译期异常,即红线,需要在编译前处理好

2、RunTimeException

运行期异常,Exception的子类,不处理系统会自动抛出:索引越界、空指针异常

3、异常处理方式

基本原理:如果抛出异常,那么就必须管它(自己try catch处理或者使用throws继续抛给上层调用或JVM)

  • a抛出: 声明此方法可能会发生的异常(不在函数内处理):在方法声明处添加 “Throws 异常类型”,将异常抛给调用者或虚拟机处理(用这种方法出现异常程序会终止运行,且 如果是运行期异常,可以不用管它), 同时还可以在内部可能出现问题的地方使用 “thread new 异常类名称” 主动抛出特定种类异常(包括自定义异常)
  • b捕获: 使用trycatch,在捕获异常后会继续执行程序。
try{ 
 	可能异常的语句 
}catch(Exception e){
	 异常的处理逻辑 
	} 

注意:

  • 针对运行期异常:可以不处理,运行时会自动抛出。

  • 抛出时如果想要抛出特定异常:
    throw new 异常a:即new一个异常对象,然后抛给上层调用。
    如果new的是运行期异常,那么可以不用在声明处 “throws 异常a”
    如果new的是编译期异常,那么必须在声明处 “throws 异常a”
    (这个处理方式更像自己为某些参数进行范围限制,自己决定什么时候是异常)

4、Error错误

int[ ] a = new int[102410241024];
OutOfMemoryError:内存溢出错误
即创建的数组大小超过了分配给JVM的内存
//此时只能对源代码进行修改,改小数组的大小。

在这里插入图片描述

5、Object的非空判断

在一个方法中,一般需要对其形参进行合法性判断,如对象非空等,可以自己写,也可以使用Objects的 requireNonNull(T obj, String str) 对传入的obj进行判空,如果为空,则抛出空指针异常并输出str字符串。

public class DemoException {
    public static void main(String[] args) {
            soutStr(null);
    }
    public static void soutStr(String str){
        /*if(str == null){          //自己抛异常
            throw new NullPointerException("出现异常,传入的对象不能为空");
        }*/
        Objects.requireNonNull(str,"出现异常,传入的对象不能为空");       //使用requireNonNull
        System.out.println(str);
    }
}

Throwable三个常用的方法

  • public String getMassage(): 返回的是异常的简短信息,内容如 IOException(“传递的文件名后缀不正确”);里的中文
  • public String toString(): 返回异常的种类+内容
  • public String printStackTrace():返回的是详细信息,JVM控制台打印的就是这个

finally代码块

和try一起使用
无论出不出异常,都会执行;一般用于资源释放(IO)
执行顺序:

  1. 无异常:try 接下来 finally
  2. 有异常:try到异常语句 接下来 finally 最后再 catch

想要无论有没有出现异常都有打印"关闭OI流":

  • 不使用finally的情况
    try {
      readFile(“clll”); //
    } catch (IOException e) {
      System.out.println(“关闭OI流”);
      e.printStackTrace();
    }
      System.out.println(“关闭OI流”);
  • 使用finally的情况
    try {
      readFile(“clll”); //想要无论有没有出现异常都有打印"关闭OI流"
    } catch (IOException e) {
      e.printStackTrace();
    } finally{
       System.out.println(“关闭OI流”);
    }

子父类异常

(声明时原则:子类的抛出异常种类必须<= 父类异常,万一父类没有抛出异常,则子类不能添加throws ,throw后只能使用try catch)

public class Fu{
   public void method1() throws NullPointerException,IOException{}/
   public void method2() throws IndexOutOfBoundsException{}
   public void method3() throws Exception{}
   public void method4(){}
}
public class Zi{
   public void method1() throws NullPointerException,IOException{} //抛出和父类一样的异常
    public void method2() throws ArrayIndexOutOfBoundsException{} //抛出父类异常的子类
   public void method3() {} //不抛出异常
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值