JAVA的异常处理(超详细说明)_java异常处理-程序员宅基地

技术标签: 笔记  java  Java基础  开发语言  

目录


异常:

异常处理方法:

1.异常基本语法:

2.try  -catch 异常处理方法

3.使用异常共同的父类Exception来捕获异常,

4.关于异常的错误输出

5.finally代码块,

6.关于异常的调用链

7.JDK新增的自动关闭接口

8.一组关键字

throws:

throw:

异常体系:

Java的异常体系分为两大类

非受查异常:

受查异常:

自定义异常类:

举例:


异常:

        运行时抛出的程序错误,编译出错不属于此处异常
      (报错的包名.类名.方法名称的那一行)第一个出现报错的位置就是程序最开始出错的位置
常见的有:除零异常,*空指针异常,数组越界异常。
***异常出错,异常之后的语句都不执行。
 

异常处理方法:

LBYL :   在操作之前,做好检查
EAFP:先运行,出错再解决(java采用的方式)
 

1.异常基本语法:

try{ 
//存放所有可能出现异常的代码
} [ catch( 捕获相应的异常)…[0…N]]{
// 出现相应异常后处理方式
}[finally]{
// 不是强制要求写
// 无论是否发生异常,都会执行finally代码块,一般进行资源的释放
//关闭资源操作
}

2.try  -catch 异常处理方法

int[] arr = {10,20,30};
try {
    arr = null;
    System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组下标异常!");
} catch (NullPointerException e) {
    System.out.println("空指针异常");
}
System.out.println("arr[1]");

3.使用异常共同的父类Exception来捕获异常,

使用场景:当程序出现多种异常,且有的异常编程时也不太清楚-不太推荐
(一般明确知道会产生那种异常,就捕获相应的异常即可,这样方便排查问题)
try{
}catch(Exception e){
}

4.关于异常的错误输出

        在java中,一切皆对象,异常也是对象,上边的空指针等,都是异常类
当产生错误时,JVM都会建立相应的异常对象传递给程序
利用e.printStackTrace();可以让程序打印出异常位置(这里是自己让程序打印出的,而不是系统报出)

5.finally代码块,

定义:无论是否产生异常,都执行
        当try代码块中,某一行语句出现异常,那么该代码块中异常之后的语句将不执行,直接跳出,如果你想无论异常是否产生都想执行一个语句,则可以放到finally代码块中。
        通过尝试运行可以发现,无论异常是否发生,finally代码块中的内容一定会执行。那么可以将资源关闭操作等重要操作,放在finally 最终代码块中善后处理
//File是Java中文件操作类
File file = new File("src/java19_1_21/test.txt");
//输入不是键盘输入,是将文件输入到Scanner类中
Scanner scanner = null;
try {
    scanner = new Scanner(file);
    System.out.println("文件正确加载完毕");
} catch (FileNotFoundException e) {
    System.out.println("文件不存在!");
    e.printStackTrace();
} finally {
    //最后处理的一些代码
    System.out.println("文件正常处理完毕”);
}
        能走到finally说明在try-catch中的逻辑已经处理完毕,只剩finally的最后处理操作。
        一旦finally中有返回值,try-catchzh返回值就失效了,一般在finally中不推荐写返回值,除非返回值和异常无关,默认返回值可放在finally中。

6.关于异常的调用链

        异常会随着调用链不断向上传递,直到有一处捕获异常并处理为止,若调用过程都没有处理异常,最终会将异常抛到JVM,程序就终止了

7.JDK新增的自动关闭接口

        一旦一个类实现了AutoCloseable借口,就表示该类具备了自动关闭的能力-声明在try代码块中会自动调用close方法
在try(此处自动关闭调用){  }

8.一组关键字

throws:

        (一般搭配自定义异常使用)用在方法声明上,明确表示该方法有可能会产生该异常,但是不处理此异常,抛回给调用者处理(谁调用谁处理)
public static void main(String[] args) {
    try{
        test();
    }catch(NullPointerException e) {
        System.out.println("捕获空指针异常!");
        e.printStackTrace();
    }
}
// 调用test方法有可能会产生空指针异常,但是test方法不处理此异常,谁调用谁处理
public static void test() throws NullPointerException,ArrayIndexOutOfBoundsException{
    String str = null;
    System.out.println(str.length());
}

throw:

        用在方法内部人为产生异常对象并抛出(之后数据结构的学习,自己在写栈等结构时,若栈为空,调用取出栈元素方法可以使用throw自定义异常)
public static void main(String[] args) {
        fun();
        System.out.println("fun之后的代码");
    }
    public static void fun(){
        throw new NullPointerException("抛个异常玩玩");
        //抛出异常后,方法就会结束
    }

异常体系:

Error:

        指的是程序的内部错误,这种错误程序猿无法捕获,一旦发生,程序只能告知用户出现错误,程序直接退出
StackOverflowError:栈溢出Error-一般中发生在递归调用链太深,递归没有出口
OutOfMemoryError:堆溢出Error

Exception:(java我们关注这个错误)

Java的异常体系分为两大类

非受查异常:

        不强制程序使用try-catch代码块
        Error以及RuntimeException(运行时异常,空指针,类型转换数组越界)及其子类都是

受查异常:

        必须显示使用try-catch处理
        除了上边的,必须显示处理,必须显示使用try-catch异常处理,或者throws抛出
        除了Error和RuntimeException以及其子类的其他异常都是受查异常,必须显示处理  
(受查就是不处理异常,编译不通过。而非受查不处理异常也可以编译通过)

自定义异常类:

        程序开发中,一定会有一些错误是和具体的业务相关的,这种错误JDK是不可能提供相应的异常类,此时就需要继承已有异常类,产生自定义异常类
若需要用户强制进行异常处理,继承Exception父类-受查异常
若不需要显示处理异常,继承RuntimeException父类-非受查异常

举例:

模拟用户登录
import java.util.Scanner;


//自定义类模拟登录
public class LoginTest {
    public static final String ID = "huweilong";
    public static final String PASSWORD = "123456";


    public static void main(String[] args) {
        try {
            login();
            System.out.println("登录成功!");
        } catch (UserNameException e) {
            e.printStackTrace();
        } catch (PasswordException e) {
            e.printStackTrace();
        }
    }


    public static void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String id = scanner.next();
        System.out.print("请输入密码:");
        String password = scanner.next();
        if (!id.equals(ID)) {
            throw new UserNameException("用户名错误!");
        }
        if (!password.equals(PASSWORD)) {
            throw new PasswordException("密码错误!");
        }
    }
}


//用户名验证
class UserNameException extends RuntimeException {
    public UserNameException(String msg) {
        super(msg);
    }
}


//密码验证
class PasswordException extends RuntimeException {
    public PasswordException(String msg) {
        super(msg);
    }
}

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46116963/article/details/122628149

智能推荐

Android音频浅析及各种音频场景下的audio data path_audiodata-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏42次。转自:Android智能手机上的音频浅析Android智能手机中各种音频场景下的audio data path1. 硬件下图是Android智能手机中目前主流的跟音频相关的硬件框图。上图中AP是应用处理器(application processor),现在用的最多的是ARM的处理器,在上面主要运行的是操作系统(OS,例如android)和应用程序。CP是通信处理器(communication processor),也叫基带处理器(baseband processor,BP)或者modem,上面_audiodata

springboot 注解参数校验,全局参数异常处理_@assertfalse-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏9次。springboot中的几种参数校验方式。常用的用于参数校验的注解如下:@AssertFalse 所注解的元素必须是Boolean类型,且值为false@AssertTrue 所注解的元素必须是Boolean类型,且值为true@DecimalMax 所注解的元素必须是数字,且值小于等于给定的值@DecimalMin 所注解的元素必须是数字,且值大于等于给定的值@Digits 所注解的元素必须是数字,且值必须是指定的位数@Future 所注解的元素必须是将来某个日期@Max 所注解的元素必须_@assertfalse

[工具学习]IOzone参数-程序员宅基地

文章浏览阅读280次。IO_ZONE参数详解。2009-08-24 22:28IOzone是一个文件系统基准工具,它生成许多文件操作并执行测试。Iozone能够运行于许多平台。这份文档涵盖Iozone所执行的许多不同类型的操作和它的所有命令行参数。Iozone执行以下操作测试文件I/O性能:Read, write, re-read, re-write, read backwards, read strided, fre..._iozone执行没数据

springBoot 解决https ssl证书验证问题_springboot x509trustmanager trustmanager = new x50-程序员宅基地

文章浏览阅读7.3k次。SpringBoot 集成webSocket所需jar包jxl.jarjava代码首先选择模板相对目录InputStream fis = new FileInputStream("/opt/upload/excel/1.xls");获取excelWorkbook wb = Workbook.getWorkbook(fis);生成完成后的路径及名字WritableWorkboo..._springboot x509trustmanager trustmanager = new x509trustmanager()

探索 Vue-Shop:一款基于 Vue.js 的电商应用示例-程序员宅基地

文章浏览阅读378次,点赞4次,收藏10次。探索 Vue-Shop:一款基于 Vue.js 的电商应用示例项目地址:https://gitcode.com/xiaofei3062/vue-shopVue-Shop 是一个开源项目,它是一个功能完善的电商平台实现,采用先进的前端框架 Vue.js 构建。对于想要学习 Vue.js 或者希望快速搭建电商应用的开发者来说,Vue-Shop 是一个极具价值的学习资源和起点。技术剖析Vue-S...

中国移动分布式块存储最大单揭晓,浪潮等中标_中移动 浪潮分布式-程序员宅基地

文章浏览阅读854次。中国移动采购与招标网11月1日消息,中国移动2019年至2020年分布式块存储产品集中采购中标候选人正式公示,按照公布的中标信息总体统计来看,该项目分布式块存储产品共计采购910套。这成为了中国移动和中国运营商在分布式块存储集采历史上最为重要的大单。以下为第一标段公示信息截图▼:点击添加图片描述(最多60个字)按照之前中国移动2019年至2020年分布式块存储产品集中采购公告细则,该项..._中移动 浪潮分布式

随便推点

matlab中mvnpdf函数,在matlab中画高斯分布 这个语句的含义请详细解释一下 z=mvnpdf(X,mu1,sigma1)...-程序员宅基地

文章浏览阅读1.4k次。匿名用户1级2015-01-13 回答Y = MVNPDF(X,MU,SIGMA) returns the density of the multivariate normaldistribution with mean MU and covariance SIGMA, evaluated at each rowof X. SIGMA is a D-by-D matrix, or an D-by..._matlab simulink有mvnpdf吗

计算机对学生生活影响论文参考文献,计算机学生论文,关于初中计算机教学相关参考文献资料-免费论文范文...-程序员宅基地

文章浏览阅读141次。导读:本文是一篇计算机学生论文范文,可作为选题参考。杨存朋 河北省石家庄市藁城区特殊教育学校初中计算机信息课程教学效果的好坏,直接影响到学生各方面能力的培养,以及他们综合素质的提高.笔者结合自己长期从事初中计算机教学工作的实际,对当前初中计算机教学存在的问题进行了深入分析,并提出了解决这些问题的初步建议,希望与同行们进行交流,共同做好初中计算机课程教学,为孩子打下良好的信息技术基础.初中;计算机教..._关于计算机对学生影响的参考文献

mybatis返回类型为map,字段为null时候不返回,所有字段为null,返回null_returninstanceforemptyrow-程序员宅基地

文章浏览阅读4.9k次,点赞6次,收藏12次。遇到很奇怪的问题,用mybatis的时候返回前端:[null] ,这就很奇怪了,因为正常来说应该返回[{“xxx1”:null,“xxx2”:null}]后面设置callSettersOnNulls为true, 这时候字段如果不全是空就返回回了[{“xxx1”:“aaa”,"xxx"2:null}]如果全是null,像这样[{“xxx1”:null,“xxx2”:null}],会返回 [nul..._returninstanceforemptyrow

ASP.NET中的healthMonitoring_<healthmonitoring>-程序员宅基地

文章浏览阅读987次。有不少朋友不了解这个所谓的healthMonitoring,实际上这是自.NET Framework 2.0就开始拥有的特性。顾名思义,它是可以帮助我们对ASP.NET应用程序运行的健康状况进行监视的一套服务。 这个部分的设置,可以在F:/Windows/Microsoft.NET/Framework/v2.0.50727/CONFIG目录下面的web.config文件中找到。 我要简要地介绍一下这个特性的架构 1. 首先,要设置有关的eventMappings,也就是说定义要监视的事件。 2. 然后,定义_

计算机网络 网络层——IP数据报 详记_ip数据报总长度怎么计算-程序员宅基地

文章浏览阅读5.9k次,点赞5次,收藏28次。IP 数据报的格式一个 IP 数据报由首部和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。IP数据报首部的固定部分中的各字段版本:占4位,指IP协议的版本。首部长度:占4位,可表示的最大十进制数值是15区分服务:占8位,用来获得更好的服务总长度:指首部和数据之和的长度,单位为字节。总字段长度为16位,因此数据报的最大长度为2^16-1。总长度必须不超过最大传送单元MTU。_ip数据报总长度怎么计算

解决github本地推送每次都需要输入用户密码问题_将本地文件推送到gitlab 密码-程序员宅基地

文章浏览阅读1.1k次。前言(废话):好久之前建了本地库,按照网上教程一步步傻瓜式的关联到网上GitHub用户,一套下来给我整蒙了,git是什么,要乌龟有啥用,本地仓库又是什么意思,也是云里雾里,它们之间的内在逻辑关系我到现在也不是很清楚,但是无所谓,只要好用就欧克,可是我搞好以后每次推送都需要输入用户名密码,很烦还要输入三次,人都晕了,导致我一段时间都没管控代码,今天一次性解决这个问题。首先,推送需要密码是因为开始关联本地git库和github时用的关联方式为HTTP方式,而不是ssh密钥方式,所有需要更改关联方式:这里不管_将本地文件推送到gitlab 密码