当前位置: 首页 > news >正文

异常处理(throw、throws、try-catch)

Java异常处理的五个关键字try、catch、finally、throw、throws

1.抛出异常throw

在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接收到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。

在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

1.创建一个异常对象,封装一些提示信息(信息可以自己编写)。

2.需要将这个异常对象告知给调用者:通过关键字throw就可以完成。throw异常对象。

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

使用格式:

throw new 异常类名(参数);

注意:

1.throw关键字必须写在方法的内部

2.throw关键字后边new的对象必须是Exception或者是Exception的子类对象

3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象。

两种处理方式:

A.throw关键字后面创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

public static void main(String[] args) {
   int[] arr = {1,2,3};
   int value = getElement(arr,3);
    System.out.println(value);
}

private static int getElement(int[] arr, int index) {
    /*
    我们可以对传递的参数数组,进行合法性校验
    如果数组arr的值是null
    那么我们就抛出空指针异常,告知方法的调用者"传递的数组的值是null"
     */
    if(arr == null){ // 空指针异常
        // throw用在方法内,用来抛出一个异常对象
        // 将这个异常对象传递到调用者处,并结束当前方法的执行。
        // NullPointerException是运行期异常RuntimeException异常的子类
        // 不用处理,默认交给JVM处理
        throw new NullPointerException("传递的数组的值是null");
    }
    /*
    对传递过来的参数index进行合法性校验
    如果index范围不在数组的索引范围内,就抛出"数组索引越界异常",告知方法的调用者
     */
    if(index < 0 || index > arr.length - 1){
        // ArrayIndexOutOfBoundsException是运行期异常RuntimeException异常的子类
        throw new ArrayIndexOutOfBoundsException("数组索引越界异常");
    }
    int value = arr[index];
    return value;
}

运行截图:

代码规范:

必须对方法传过来的参数进行合法性校验,如果参数不合法,那么我们就必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题

 

2.Objects非空判断

之前学过一个类Objects,由静态的实用方法组成,这些方法是null-save或null-torelent,那么在它的源码中,对对象为null的值进行了抛出异常操作。

public static <T> requireNonNull(T obj):查看指定引用对象不是null

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
public static void method(Objects obj){
    /*// 对传递过来的参数进行合法性判断,判断是否为null
    if (obj == null) {
        throw new NullPointerException("传递的参数为null");*/

    // 第二种方法:调用Objects的方法
    // Objects.requireNonNull(obj);
    Objects.requireNonNull(obj,"该参数传递的值是null");
    }

B.throw关键字后面创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

3.声明异常throws

声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲),那么必须通过throws进行声明,让调用者去处理。

关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。

声明异常格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2...{   }

注意:

1.throws关键字必须写在方法声明处

2.throws关键字后边声明的异常必须是Exception或者Exception的子类

3.方法内部如果抛出多个异常对象,那么throws后面必须也声明多个异常,如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可。

4.调用一个声明抛出异常的方法,就必须处理声明的异常,要么继续使用throws声明抛出交给方法的调用者,最终给JVM。要么try catch自己处理异常。

public static void main(String[] args) throws IOException {
    String fileName = "d:\\a.txt";
    // 继续使用thrxows声明异常,抛给JVM
    readFile(fileName);
}
/*
定义一个方法,对传递的文件路径进行合法性判断
如果路径不是"c:\\a.txt",那么我们就抛出文件找不到异常对象,告知方法的调用者
 */
public static void readFile(String fileName) throws IOException { // 加上throww声明异常
    // 返回给主方法
    if(!fileName.equals("c:\\\\a.txt")){ // 路径异常
        // 报错,编译异常
        throw new FileNotFoundException("传递的文件路径不是c:\\\\a.txt");
    }
    /*
    如果传递的路径,不是.txt结尾
    那么我们就抛出IO异常对象,告知方法的调用者,文件的后缀名不对
     */
    // if(!fileName.split(".")[1].equals("txt") ){
    if(!fileName.endsWith(".txt")){
        // 报错,编译异常,需要声明
        throw new IOException("文件的后缀名不对");
    }
    System.out.println("路径没问题,读取文件");
}

4.捕获异常try...catch

如果异常出现的话,会立刻终止程序,所以我们得处理异常:

1.该方法不处理,而是声明抛出,由该方法得调用者来处理(throws)

2.在方法种使用try-catch的语句块来处理异常

try-catch的方法就是捕获异常

捕获异常:Java种对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。

捕获异常语法如下:

try{
    编写可能会出现异常的代码
}catch(异常类型 e){
    处理异常的代码
    //记录日志/打印异常信息/继续抛出异常        
}

注意:

1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象

2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕后catch中的处理逻辑,继续执行try...catch之后的代码

    如果try中没有产生异常,那么就不会执行catch中的异常处理逻辑,执行完毕后catch中的处理逻辑,继续执行try...catch之后的代码

public static void main(String[] args) {
    try{
        readFile("d:\\a.tt");
    }catch(IOException e){ // try中抛出什么异常对象,catch就定义什么异常变量,
        // 用来接收这个异常对象
        System.out.println(e);
    }
    // try catch执行后,继续执行后续代码
    System.out.println("后续代码");
}
public static void readFile(String fileName) throws IOException { // 加上throws声明异常

    /*
    如果传递的路径,不是.txt结尾
    那么我们就抛出IO异常对象,告知方法的调用者,文件的后缀名不对
     */
    if(!fileName.endsWith(".txt")){
        // 报错,编译异常,需要声明
        throw new IOException("文件的后缀名不对");
    }
    System.out.println("路径没问题,读取文件");
}

运行截图:

 

 

相关文章:

  • Throwable查看获取的异常信息方法以及finally代码块
  • 异常的注意事项
  • 自定义异常
  • 进程与线程
  • 线程类以及创建多线程的第一种方式---继承Thread类
  • Thread类的构造方法及常用方法
  • 创建多线程的第二种方式--实现Runable接口
  • Thread和Runnable的区别和匿名内部类方式实现线程的创建
  • 线程安全
  • 数据结构基本概念和术语
  • 线程状态
  • Object类中wait带参方法和notifyAll方法
  • File类
  • 递归(斐波那契数列、类加、累乘、打印多级目录)
  • FileFilter过滤器
  • [译]Python中的类属性与实例属性的区别
  • Angular Elements 及其运作原理
  • C++入门教程(10):for 语句
  • canvas 五子棋游戏
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA SE 6 GC调优笔记
  • Python3爬取英雄联盟英雄皮肤大图
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vuex 学习笔记 01
  • 翻译:Hystrix - How To Use
  • 开发基于以太坊智能合约的DApp
  • 如何在GitHub上创建个人博客
  • 什么软件可以剪辑音乐?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • ionic入门之数据绑定显示-1
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • ${ }的特别功能
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)(1.9) MSP (version 4.2)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (16)Reactor的测试——响应式Spring的道法术器
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)字符分类函数
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (强烈推荐)移动端音视频从零到上手(上)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .NET Core 版本不支持的问题
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net Memory Profiler的使用举例
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • /etc/sudoers (root权限管理)
  • @private @protected @public