异常理解

 Java的异常分为两种,checked异常(编译时异常)和Runtime异常(运行时异常)

1.       java认为checked异常都是可以再编译阶段被处理的异常,所以它强制程序处理所有的checked异常,而Runtime异常无须处理,java程序必须显式处理checked异常,如果程序没有处理,则在编译时会发生错误,无法通过编译。

      checked异常体现了java设计哲学:没有完善处理的代码根本不会被执行,体现了java的严谨性,

     对于构造大型、健壮、可维护的应用系统而言,错误处理是整个应用需要考虑的重要方面。Java异常处理机制,在程序运行出现意外时,系统会生成一个Exception对象,来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

Checked异常和Runtime异常体系

 java异常被分为两大类:Checked异常和Runtime异常(运行时异常)。

所有RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。

只有java语言提供了Checked异常,其他语言都没有提供,java认为Checked异常都是可以被处理(修复)的异常,所以java程序无须显式的处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。

Checked异常的处理方式:

①:当方法明确知道如何处理异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修补该异常。

②:当方法不知道如何处理异常,应该在定义该方法时声明抛出该异常。

Runtime异常无须显式声明抛出,如果程序需要捕捉Runtime异常,也可以使用try...catch块来捕获Runtime异常。

问题是:大部分的方法总是不能明确知道如何处理异常,这就只能声明抛出异常了。

使用throws抛出异常

使用throws抛出异常的思路是:当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道应该如何处理这种类型的异常,也可以使用使用throws声明抛出异常,该异常将交给JVM来处理。

JVM对异常的处理方法:打印异常跟踪栈的信息,并终止程序运行,所以有很多程序遇到异常后自动结束。

使用throws抛出异常的格式:

throws声明的抛出的语法格式紧跟在方法之后,可以声明多个异常类,多个异常类之间以逗号隔开。一旦使用了throws语句声明抛出异常,就不用再使用try...catch来捕获异常了。

如:throws ExceptionClass1,ExceptionClass2...

注意点1:如果某段代码调用了一个带throws声明的方法,该方法声明抛出了Checked异常,这表明该方法希望它的调用者来处理该异常。那么这段代码要么放在try块中显示捕获该异常,要么这段代码处于另一个带throws声明抛出的方法中。

自定义异常类

用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类。

应以异常类通常需要提供两种构造器:一个是无参数的构造器,另一个是带一个字符串的构造器,这个字符串将作为该异常对象的详细说明(也就是异常对象的getMessage方法的返回值)。

通常情况下,程序会很少自行抛出系统异常,因为异常的类名通常包含了该异常的有用信息,所以在选择抛出什么异常时,应该选择合适的异常类,从而可以明确地描述异常情况,这样程序常常需要定义异常类。

用户定义异常类,需要基础Exception基类,如果希望定义RuntimeException基类,就应该继承该基类,定义异常类时通常需要提供两种构造器:1,无参的构造器,2,带字符串的构造器,这个字符串作为该异常对象的详细说明,(也就是异常对象的getMessage方法返回值),调用super将字符串参数传给异常对象的message属性,message属性就是异常对象的详细描述信息。


你可能感兴趣的:(java)