Java异常,try--catch--finally
)
异常
异常:就是程序运行时候出现不正常情况。
异常的由来:Java是纯面向对象语言,异常就是Java用面向对象的思想将不正常的情况进行了封装。
异常的分类
Error:比较严重的异常
Exception:较容易解决的异常
Exception
运行时异常:
在运行时抛出的异常,要根据提示的信息处理这类异常,继承RuntimeException。
编译时异常(受检异常):
在写代码时就出现了提示的异常,并不是因为代码的书写错误,而是缺少了一些部分(快捷键Alt+ Enter可以提供解决方案),继承Exception。
受检异常是必须解决的异常,否则编译不会通过。用try{}catch语句块或throws处理。
是“未雨绸缪”
异常的解决方法
try–catch解决异常
要catch详细的异常,不同的异常有不同的解决方法,只有实在找不出问题所在才能用try–catch(Exception e)解决所有异常
public void test4(){
try {
FileInputStream fileInputStream = new FileInputStream("java,txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
throws和thow关键字
1)throws出现在方法的声明中,表示该方法可能会抛出的异常,是“未雨绸缪”,然后交给上层调用它的方法程序处理,允许throws后面跟着多个异常类型;
2)一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。throw只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去。throw关键字的一个非常重要的作用就是 异常类型的转换。
throws表示出现异常的一种可能性,并不一定会发生这些异常;
throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由方法去处理异常,真正的处理异常由此方法的上层调用处理。
throws
public void testTrowException() throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("java.txt");
}
public static int getDataByIndex(int index,int[] data) {
if(index<0||index>=data.length)
throw new ArrayIndexOutOfBoundsException("数组下标越界");
return data[index];
try–catch–finally
当然如果没有发生异常,则catch块不会执行。
但是finally块无论在什么情况下都是会执行的(这点要非常注意,因此部分情况下,都会将释放资源的操作放在finally块中进行)。
在使用try…catch…finally块的时候,注意千万不要在finally块中使用return,因为finally中的return会覆盖已有的返回值。
结构
Alt +Enter --Surround with try/catch 自动形成框架,但框架中无finally,需要finally要自行添加
try {
需要检查的代码(可能会抛出异常,也可能不会抛出异常)
}
catch(异常的类型 异常类型的变量) {
捕获异常后要处理异常
没有抛出异常就不执行catch(可以抛出多个catch)
}
finally {
一定会被执行的代码(不管异常抛不抛出都会执行),一般收尾
}
多重捕获块(多个catch)
在有多个catch块的时候,是按照catch块的先后顺序进行匹配的,一旦异常类型被一个catch块匹配,则不会与后面的catch块进行匹配。
try {
需要检测的代码(可能会抛出异常,也可能不会抛出异常)
} catch (异常的类型1 异常类型的变量1) {
捕获异常后处理异常
} catch (异常的类型2 异常类型的变量2) {
捕获异常后处理异常
} catch (异常的类型3 异常类型的变量3) {
捕获异常后处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行,例如数据库释放连接)
要注意多个catch的顺序
}
自定义异常:
1、所有的异常的都是Throwable的子类
2、如果写一个运行时异常,需要继承RuntimeException
3、如果要写一个编译时异常,继承Exception
throws、throw
throws可以抛出异常,也可以捕获
throw手动抛出一个异常
public class SqrtHomework {
//设计自己的异常类表示对负数求平方根的错误;
// 在类Test的主方法中,从键盘输入一个数,
// 若输入的数不小于0,则输出它的平方根;
// 若小于0,则抛出自定义异常;
// 在程序中处理异常并输出提示信息
// “输入错误,不能对负数求平方根”
private double num;
public void Test (double num) {
this.num = num;
}
private void sqrt(double num) throws SqrtException {
if (num >= 0.0){
double result = Math.sqrt(num);
}
else {
throw new SqrtException(num);
}
}
public static void main(String[] args) {
SqrtHomework sqrtHomework = new SqrtHomework();
try {
sqrtHomework.sqrt(-8.0);
} catch (SqrtException e) {
e.printStackTrace();
}
}
public class SqrtException extends Exception{
private double num;
public SqrtException(double num){
super("输入错误,不能对负数求平方根" + num);
this.num = num;
}