Java异常相关知识点和面经梳理

1、异常类

在java中,异常对象都是派生于Throwable类的一个实例。当然,如果内置的异常类不能够满足需求的话,用户可以创建自己的异常类。下图是异常类的层次结构图:

由图可知,所有的异常都是由Throwable继承而来,然后在下一层分解成两个分支:Error和Exception。

Error类描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该跑出这种类型的变量。开发人员更多的需要关注的是Exception类,这个类又可以分成两个大的分支:RuntimeException和其他异常。由于程序错误导致的异常属于RuntimeException;程序本身没有错误,但是遇到了像I/O错误这类问题导致的异常属于其他异常。

派生于RuntimeException的异常包括错误的类型转换、空指针异常、数组下标越界等。其它包括文件尾部读取数据、打开一个不存在的文件等。

Java语言规范又多上述异常进行了分类,将派生于Error类和RuntimeException类的所有异常称为非受查异常,所有其它的异常属于受查异常。Java认为受查异常都是可以被处理的异常,所以Java程序必须显示处理受查异常。如果程序没有处理抽查异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对受查异常处理方法有两种

(1)当前方法知道如何处理该异常,则用try…catch块来处理该异常。

(2)当前方法不知道如何处理,则在定义该方法是声明抛出该异常。

2、Java中的异常处理关键字

(1)throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理。throw关键字用于向运行时抛出异常来处理它。
(2)throws:当我们在方法中抛出任何已检查的异常而不处理它时,我们需要在方法签名中使用throws关键字让调用者程序知道该方法可能抛出的异常。调用方法可以处理这些异常或使用throws关键字将其传播给它的调用方法。我们可以在throws子句中提供多个异常,也可以与main()方法一起使用。
(3)try-catch:我们在代码中使用try-catch块进行异常处理。try是块的开始,catch是在try块的末尾处理异常。我们可以使用try有多个catch块,try-catch块也可以嵌套。catch块需要一个应该是Exception类型的参数。
(4)finally:finally块是可选的,只能用于try-catch块。由于异常会暂停执行过程,因此我们可能会打开一些不会关闭的资源,因此我们可以使用finally块。finally块总是被执行,无论是否发生异常。
 

3、列出常见的几种RunTimeException异常

NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常
IllegalArgumentException - 传递非法参数异常
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NumberFormatException - 数字格式异常
UnsupportedOperationException - 不支持的操作异常
NegativeArrayException - 数组负下标异常
EOFException - 文件已结束异常
FileNotFoundException - 文件未找到异常
SQLException - 操作数据库异常
IOException - 输入输出异常
NoSuchMethodException - 方法未找到异常
java.lang.AbstractMethodError - 抽象方法错误。当应用试图调用抽象方法时抛出。
java.lang.Error - 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。
 

4、Java异常类的常用方法

(1)异常及其所有子类不提供任何特定方法,并且所有方法都在基类Throwable中定义。
(2)getMessage():此方法返回消息异常消息内容,并且可以通过构造函数创建异常时提供这个message消息。
(3)getLocalizedMessage():提供此方法,以便子类可以覆盖它以向调用程序提供特定于语言环境的消息。此方法getMessage()的可抛出类实现只是使用方法来返回异常消息。
(4)getCause() :此方法返回异常的原因。
(5)toString():此方法以字符串格式返回有关Throwable的信息,返回的String包含Throwable类和本地化消息的名称。
(6)printStackTrace() :此方法将堆栈跟踪信息打印到标准错误流,此方法已重载,我们可以将PrintStream或PrintWriter作为参数传递,以将堆栈跟踪信息写入文件或流。

 

5、try-catch-finally-return执行顺序

(1)不管是否有异常产生,finally块中代码都会执行
(2)当try和catch中有return语句时,finally块仍然会执行
(3)当finally中不存在return语句时,由于finally是在return后面的表达式运算执行的,所以函数返回值在finally执行前确定的,无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值
(4)当finally中存在return语句时,及时try或catch中保存的也返回了值,但最终返回值是finally中return的值。

 

6、throw和throws的区别?

(1)Throw用于方法内部;Throws用于方法声明上

(2)Throw后跟异常对象,要抛出的就是这个异常对象;Throws后跟异常类型,不是具体的对象而是类别

(3)Throw后只能跟一个异常对象,Throws后可以一次声明多种异常类型

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值