异常

1.异常
异常:在运行时发生的错误
异常类:描述不正常的情况的类
在Java中将异常按照面向对象的思想将问题封装成了对象,用异常类对其进行描述。以对象抛出的形式体现。

2.体系
由于问题很多,也就说描述的类也很多。
将其共性进行向上抽取,形成了异常体系。

Throwable(可抛出)

  • 一般不可处理的(Error)
    特点:是由jvm(虚拟机)抛出的严重性的问题
    不处理,直接修改程序
  • 可以处理的(Exception)

无论是error还是exception,问题发生就应该可以抛出,而这个体系的特点就在于throwable及其所有的子类都具有可抛性。

异常声明抛出
可抛性的体现:通过throws和throw两个关键字体现。
凡是可以被这两个关键字所操作的类和对象都具有可抛性。

函数内出现异常,需要在函数外申明;调用了发生异常的函数或者申明异常的函数,处理方式就是抛出

throws和throw的区别:
1.throws使用在函数上
throw使用在函数内
2.throws抛出的是异常类,可以抛出多个,用逗号隔开
throw抛出的是异常对象。

3.异常的分类

  • 编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系
  • 编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。

自定义异常时,要么继承Exception,要么继承RuntimeException。

4.异常捕捉trycatch
这是可以对异常进行针对性处理的方式

具体格式:

try
{
//需要被检测异常的代码。
}
catch(异常类 变量)//变量:用于接收发生的异常对象
{
//处理异常的代码。
}
finally
{
//一定会被执行的代码。
}

举个栗子
数组角标越界

class FuShuIndexException extends Exception
{
    FuShuIndexException()
    {}
    FuShuIndexException(String msg)
    {
        super(msg);
    }
}

class Demo9
{
    public int method(int[] arr,int index)throws FuShuIndexException
    {
        if(index<0)
            throw new FuShuIndexException("角标变成负数了");
            return arr[index];
    }
}
public class ExceptionDemo {

    public static void main(String[] args) {
        int[] arr = new int[3];
        Demo9 d = new Demo9();
        try
        {
            int num = d.method(arr, -30);
            System.out.println("num="+num);
        }
        catch (FuShuIndexException e)
        {
            System.out.println("负数角标异常");
        }
        System.out.println("over");
    }

}
运行结果

多catch情况
一个try对象多个catch,有几个异常捕获几个。

多catch父类的catch放在最下面

finally代码块
一定会执行的代码。
但是,当退出jvm时不执行(System.exit(0);)

  • finally的作用
    通常用于关闭(释放)资源。

  • try catch finally 代码块组合特点:

    • try catch(多个)
      当没有必要资源需要释放时,可以不用定义finally。
    • try finally
      异常无法之间catch处理,但是资源需要关闭

5.异常处理原则

  • 函数内容如果抛出需要检测的异常,那么函数上必须要申明。否则必须在函数内用try catch捕捉。
  • 如果调用到了声明异常的函数,要么try catch要么throws。
  • 功能内容可以解决,用catch
    解决不了,用throws声明抛出
  • 一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个。

6.异常的注意事项

  • 子类在覆盖父类的方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
  • 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
  • 如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛。只能try不能抛。

你可能感兴趣的:(异常)