异常(throwable(Error + Exception) throw+throws+try catch)

在这里插入图片描述
IOException: I/O:inputstream/outputstream
常常出现的场景:一般在读写数据的时候会出现这种问题。
RuntimeException:空指针,非法表达式,数组越界,未知类型等错误。
Throwable
有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。

除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

Error(错误)
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError

Exception(异常)
是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
在这里插入图片描述

区别
注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。
**除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。**这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

五个关键字:try, catch, finally, throw, throws

try, catch

try
{
// 业务实现代码
}
catch(Exception e)
{
输入不合法
}

  • 如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给java运行时环境,这个过程被称为抛出(throw)异常
  • 当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,这个过程称为捕获(catch)异常,若找不到catch,则运行时环境终止,Java程序退出。

try块里声明的变量是代码快内局部变量,只在try快内有效,在cathc块中不能访问。
try后面可以跟好几个catch,但是一次只能执行一个。
IndexOutOfBoundsException:数组越界异常 NumberFormatException:数字格式异常
ArithmeticException:算术异常
NullPointException:空指针异常
异常捕获时,先捕获小异常,再捕获大异常
catch捕获多种异常:
catch(IndexOutOfBoundsException | NumberFormatException)
{
final ie = new NumberFormatException(“test”);
}
捕获多种异常时,异常变量使用隐式的final修饰
捕获一种异常时,异常变量没有final修饰。
try
{
FileInputStream fis = new FileInputStream(“a.txt”);
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
getMessage():得到异常对象的详细信息。
printStackTrace():打印异常的追踪信息
finally 回收资源

finally回收try块中打开的物理资源(数据库连接、网络连接、磁盘文件)。不管怎样,finally块总会被执行
有try块,catch和finally至少有一个,catch块可以有多个,finally块必须在catch后面。
除非在try块、catch块中调用了退出虚拟机的方法(System.exit(1)),否则不管在try,catch中执行了怎样的代码、出现了怎样的情况,异常处理的finally块都会被执行。
在finally块中,不要使用return 和throw,这将会导致try、throw块中的return、throw失效。
Java 7增加了try语句的功能,它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,try语句在该语句结束时自动关闭这些资源。这些资源实现类必须实现AutoCloseable或Closeable接口,实现它们的close()方法。
使用throws声明抛出异常
思路:

当前方法不知道如何处理这种类型的异常,该异常应该由上一级调度者处理;
如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常交给JVM处理。
JVM对异常的处理:打印异常的跟踪栈信息,并中止程序运行。
使用throw声明抛出异常
程序自行抛出异常,用throw完成。throw抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。
使用throw语句抛出的异常时Checked异常(提示程序员修改),throw语句可以放在try块里,也可以放在一个带throws声明抛出的方法里。
如果抛出的runtime异常,无须显式声明抛出。

catch和throw一起使用
在实际应用中,当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可以完全处理。
try
{
d = Double.parseDouble(bidPrice);
}
catch(Exception e)
{
e.printStackTrace();
throw new AuctionException(“竞拍必须是数值”);
}
当catch捕获到异常后,系统打印该异常的跟踪栈信息,接着抛出一个AuctionException异常,通知该方法的调用者再次处理该AuctionException异常。
在这里插入图片描述
异常链
程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息,这种处理方式被称为:异常转译。

异常跟踪栈
函数调用过程:main方法调用firstMethod方法,firstMethod调用secondMethod方法,secondMethod调用thirdMethod方法。
异常处理过程:逆序: 异常从thirdMethod方法开始触发,传到secondMethod方法,再传到firstMethod方法,最后传到main方法,在main方法中止,这个过程就是Java的异常跟踪栈。

java异常处理的throw和throws的区别

  1. 区别

throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型

2.分别介绍

throws:用于声明异常,例如,如果一个方法里面不想有任何的异常处理,则在没有任何代码进行异常处理的时候,必须对这个方法进行声明有可能产生的所有异常(其实就是,不想自己处理,那就交给别人吧,告诉别人我会出现什么异常,报自己的错,让别人处理去吧)。

格式是:方法名(参数)throws 异常类1,异常类2,…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值