Java面向对象(七):异常

java中的异常分为两大类:

Error 错误,严重的情况,一旦发生程序中无法处理。

Exception 异常,运行时出现的非正常情况,一旦发生,可以对其进行处理。

Throwable类是Java语言中所有错误和异常的Throwable类。两个子类的势力,Error和Exception。

Error:不做详细说明
Exception:
----RuntimeException 运行时异常,也称为非检测异常,在程序中可以处理,也可以不处理的异常。

----除了RuntimeException外,都是非运行时异常,也成为检测异常,这些异常在程序中必须处理,不处理不行(编译不通过)
----------如:FileNotFoundException、ClassNotFoundException

Throwable主要的方法有:
getMessage()
printStackTrace()

异常类中一般有三个构造器,比较常用:
空构造器
一个字符串参数的构造器
一个异常类型参数的构造器

语法错误、逻辑错误、编码错误这些都不是异常,这些称为编译错误。

在这里插入图片描述
捕获异常

 try :捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码放在try语句块中。

 catch (Exceptiontype e):在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。

 与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
–---- getMessage()方法,用来得到有关异常事件的信息
–---- printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。

 finally:不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行。finally语句是可选的

try…finally结构是真是开发中比较常用的,目的:不捕获任何异常,但是我有资源必须释放,这个时候通常采用try…finally结构。

注意事项
– try、catch、finally三个语句块均不能单独使用,三者可以组成 try…catch…finally、try…catch、try…finally三种结构,catch语句可以有一个或多个,finally语句最多一个;

– try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面;

– 多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下;

– 基类异常的捕获语句不能写在子类捕获语句的前面;

规则:重写方法需要抛出与原方法所抛出异常类型一致或不抛出,(此规则不包括非检测异常)

异常的抛出: throws
 声明抛出异常:处理异常的第二种方式

– 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

– 在方法声明中用 throws 子句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

– 声明抛出异常举例:

public void readFile(String file) throws FileNotFoundException {
    
    
		......
		// 读文件的操作可能产生FileNotFoundException类型的异常
		FileInputStream fis = new FileInputStream(file);
		......
     }

方法声明处抛出对象throws关键字
A: throws声明
将问题标识出来,报告给调用者。如果方法内通过throw抛出了检测异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。

B: 声明异常格式
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2… { }

C:注意事项:
throws后面可以写多个异常类,用逗号隔开。

方法中手动抛出异常:throw
 方法内部抛出异常对象:throw关键字

在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。
throw 用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行(有finally块会先执行完在结束)。

使用throw关键字具体操作
 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
 通过关键字throw将这个异常对象告知给调用者。
throw关键字使用格式
throw new 异常类名(参数);
例如:throw new NullPointerException(“要访问的arr数组不存在”);
throw new ArrayIndexOutOfBoundsException(“该索引在数组中不存在,已超出范围”);

手动抛出一个异常,**为什么呢?意义?**就是为了告诉方法的调用者这里出现了异常。

自定义异常

当JDK中的异常类型不能满足程序的需求的时候,可以自定义异常类。使用自定义异常类的步骤:

 定义异常类,并继承Exception或者RuntimeException;
 编写异常类的构造方法,并继承父类的实现;

自定义异常:通过查看异常类的相关源代码,发现没啥可看的,异常类实际上都差不多,只是名字不同,为什么这样设计?原因:通过不同的异常,可以推断出系统发生了什么问题。

面试题:

一、final finally finalize的区别?
个人理解:

final:可以修饰类、方法、变量,表示最终的,修饰的类,不能被继承,修饰的方法,不能被覆盖,修饰的变量,只能一次赋值,赋值之后,不可以再次赋值。

finally:是在java的异常处理中的try…catch…finally,使用,不能单独使用,finally块的代码不管是否抛出异常都会执行,所以一般都是用来做一些释放资源的操作,如:关闭IO流、关闭数据库连接、关闭Socket等

finalize:是Object类的一个方法,作用是可以通知垃圾回收器,有垃圾需要回收了,我们使用这个方法时,需要重写这个方法,把需要释放的资源写到这个方法体中,垃圾回收器回收的时候会自动调用这个方法。

二、throws throw的区别?
1.作用不同: throw 用于程序员自行产生并抛出异常, throws 用于声明该方法内抛出了异常;
2.使用的位置不同: throw 位于方法体内部,可以作为单独语句使用; throws 必须跟在方法参数列表的后面,不能单独使用;
3.内容不同: throw 抛出一个异常对象,且只能是一个; throws 后面跟异常类,且可以跟多个异常类;
4.如果异常抛给了main()方法,主方法不处理任何异常,而交给Java中最大头JVM,所以如果在main方法使用了throws关键字,则表示一切异常交给JVM进行处理。默认处理方式也是JVM完成。

三、throws throw必须是成对出现的吗?请举例说明
个人理解:不一定,当方法中的代码块出现了异常,而且不立刻处理,可以显式抛出给调用者,这时候只需要使用throws声明方法就可以了;当我们想自己抛出异常时使用throw,如果这个异常是运行时异常的话,就不需要throws进行声明,如果是检测异常,则此方法需要throws进行声明,此时才会成对出现。

四、请你写出你常见的10个异常类?

常见的RuntimeException异常:

1.NullPointerException: 空指针异常。当应用程序试图访问空对象时,则抛出该异常。
2.ClassCastException: 类型强制转换异常。它是JVM在检测到两个类型间转换不兼容时引发的运行时异常。
3.ArrayIndexOutOfBoundsException: 数组下标越界异常。跟数组打交道时,需要注意一下这个异常。
4.ArithmeticException:算术运算异常。当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
5.NumberFormatException: 数字格式异常。当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。如,”abc”转为int型

常见的 Checked Exception 异常:

1.SQLException:操作数据库异常 。提供关于数据库访问错误或其他错误信息的异常,它是Checked Exception(检查异常)。
2.IOException:IO异常。一般跟读写文件息息相关,它也是Checked Exception(检查异常)。平时读写文件,记得IO流关闭!
3. TimeoutException:阻塞操作超时异常。 指定超时的阻止操作需要一种表示超时发生的方法。 对于许多这样的操作,可以返回一个指示超时的值; 当不可能或不可取的时候,应该声明和抛出TimeoutException 。
4.FileNotFoundException:文件未找到异常。当试图打开指定路径名表示的文件失败时,抛出此异常。(IOException的子类)。
5.NoSuchMethodException:方法未找到异常。

结束语

有不理解或者GTQ28写错的都可以留言哟~~~
希望多多交流,多多关注
继续学习…
白白laaaaa

猜你喜欢

转载自blog.csdn.net/zhangzhanbin/article/details/112394449