JAVA第十天!

Exception 异常

1 什么是异常?
程序在 编译时(build time) 或 运行时(run time) 出现的错误。
这样的错误如果不处理可能会导致程序无法正常运行。
在java中异常会被描述成 异常类,在JDK中存在,以Exception为结尾。

1.1编译时异常 checked Exception 受检异常
如果编译时出现错误,程序就无法运行(必须解决啊!)
1.2运行时异常 runtimeException unchecked Exception 非受检异常(最终是由JVM处理)
运行时中断程序的执行。
1.检查型异常(Checked Exception)
个人理解:所谓检查(Checked)是指编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免,另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try …catch)的异常。如果不处理这类异常,集成开发环境中的编译器一般会给出错误提示。
例如:一个读取文件的方法代码逻辑没有错误,但程序运行时可能会因为文件找不到而抛出FileNotFoundException,如果不处理这些异常,程序将来肯定会出错。所以编译器会提示你要去捕获并处理这种可能发生的异常,不处理就不能通过编译。
在这里插入图片描述
2.非检查型异常(Unchecked Exception)
个人理解:所谓非检查(Unchecked)是指编译器不会检查这类异常,不检查的则开发者在代码的编辑编译阶段就不是必须处理,这类异常一般可以避免,因此无需处理(try …catch)。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。
例如:你的程序逻辑本身有问题,比如数组越界、访问null对象,这种错误你自己是可以避免的。编译器不会强制你检查这种异常。
在这里插入图片描述

1.3认识异常类
类的结构
Exception extends Throwable
Error extends Throwable
A)Error 系统错误,无法通过捕获去解决。一般这样的错误,程序不需要关心。
B)Exception 比Error级别低,且能够处理。比如:
NullPointException
ArithmeticException

2 异常的处理
2.1 throw throws 逃避 谁产生的问题你找谁解决

在现实世界中,员工解决不了的问题,都抛给领导。
A)Throw
在java中,遇到exception,开发者自己throw 跑出异常,并不解决问题,直接把问题抛给了调用者。

在方法体中可以使用throw 关键字
B)Throws
用于方法定义中参数的后面,此时开发者不需要处理异常,只是把可能发生的异常传递给该方法的调用者(调用该方法的方法)。
代码在a方法中,代码可能出现异常,则a方法throws异常类型,main调用a方法,由于a throws 抛出了main,main如果不解决,继续throws,由于JVM调用main方法,要执行程序,所以main throws给JVM,JVM没办法了只能执行了。

Thows : 针对一个方法体抛出(可能抛出所有的异常信息因为JVM不会解决异常,但是可以打印)!
Tip : 将异常往上传,谁调用就给谁(调用该方法的方法!)
eg:public void buySomething(int price) throws ArithmeticException{}

2.2 try/catch 尝试解决,不逃避 迎难而上
Throw 和throws 并不解决异常,只是抛出异常而已。
而 try-catch和 try-catch-finally是真正处理异常的。
Tip:如果try-catch-finally方法中catch后面有return的话finally永远都会在catch的return前去执行**(**面试的时候可能会问这个问题!)

如果使用了try-catch,则程序能够继续执行下去,因为已经做了处理。

在这里插入图片描述在这里插入图片描述

在捕获异常时,尽可能使用Exception子类型,如此可以迭代多个catch

Try-catch–finally
在这里插入图片描述

总结:对应异常,处理的方式要么throw,要么try-catch。
1 对于受检异常,是必须处理。
2非受检异常可以不用处理,但是最终是由JVM处理(把异常的信息打印在控制台上,一般的格式:Exception in “xxx” thread:。。。。)。
3 使用try-catch,不影响程序的继续执行。

3 自定义异常 异常怎么去使用
根据阿里巴巴的编程规范,异常的类名都以Exception,所以我们自定义的异常也要根据这个规范。
Exception

  • runtimeException 非受检 运行时 编译时没有问题
  • 受检异常 比如ParseException 受检异常

如果写一个受检异常(编译异常)类,则需要继承Exception类(默认是受检异常)

如果写一个非受检异常类(运行异常),那么就需要继承RuntimeException(非受检异常)(运行异常)
throw new MyLoginException();
一般情况下,自定义异常时,会使用非受检异常。
逻辑:比如实现登录功能,如果用户名和密码不匹配,以异常的方式出现。
在这里插入图片描述

自定义异常类的目的是为了将来使用,则必须指定何时触发这个异常的。自定义异常类触发使用 只有一种方式就是throw new 这个异常对象。
将来调用者去处理异常,当然对于受检异常,则必须处理。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值