异常
2017-11-06 本文已影响0人
咸鱼有梦想呀
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处理,但是资源需要关闭
- try catch(多个)
5.异常处理原则
- 函数内容如果抛出需要检测的异常,那么函数上必须要申明。否则必须在函数内用try catch捕捉。
- 如果调用到了声明异常的函数,要么try catch要么throws。
- 功能内容可以解决,用catch
解决不了,用throws声明抛出 - 一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个。
6.异常的注意事项
- 子类在覆盖父类的方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
- 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
- 如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛。只能try不能抛。