异常:就是程序在运行时出现不正常情况
1,异常由来:问题也是现实生活中的具体事物,也可以通过java的类的形式进行描述。并封装成对象
其实就是java对不正常情况进行描述后的对象体现
对于问题的划分:两种:一种是严重的问题,一种是非严重的问题
对于严重的,java通过Error类进行描述
对于Error一般不编写针对性的代码对其进行处理
对于非严重的,java通过Exception类进行描述。
对于Exception可以使用针对性的处理方式进行处理
无论Error或者Exception都有一些共性内容
比如:不正常的信息,引发原因等
Thowable
|--Error
|--Exception
2,异常的处理:
java提供了特有的语句进行处理
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;
}
finally
{
一定会执行的语句;
}
3,对捕获到的异常进行常见方法操作
String getMessage(); 获取异常的信息
在函数上声明异常
便于提高安全性,让调出进行处理。不处理编译失败
对多异常的处理
1,声明异常时,建议声明更具体的异常。这样处理可以更具体
2,对方声明几个异常,就对应几个catch块。不要定义多余的catch块
如果多个catch中的异常出现继承关系,父类异常catch块放在最下边
建议在进行catch处理时,catch中一定要具体的处理方式
不要简单的定义一句 e.printStackTrace();
也不要简单的就写一条输出语句
代码演示:
- class Demo
- {
- int div ( int a ,int b) throws ArithmeticException , ArrayIndexOutOfBoundsException
- //在功能上通过static关键字声明了该功能有可能出现问题
- {
- int arr [] = new int [a];
- System.out.println(arr[4]);
- return a/b;
- }
- }
-
- class ExceptionDemo
- {
- public static void main(String[] args)
- {
- Demo d = new Demo();
- try
- {
- int x = d.div(4,0);
- System.out.println("x=="+x);
- }
- catch(ArithmeticException e) //Exception e = new ArithmeticException();
- {
- System.out.println("除零");
- System.out.println(e.getMessage());
- System.out.println(e.toString());
- e.printStackTrace();
- //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。打印异常在堆栈的跟踪信息
- }
- catch (ArrayIndexOutOfBoundsException e)
- {
- System.out.println(e.getMessags());
- System.out.println("下标越界");
- }
-
- System.out.println("over");
- }
- }
复制代码
因为项目中会出现特有的问题
而这些问题并未被java所描述并封装对象
所以对于这些特有的问题可以按照java的对问题封装的思想
将特有的问题进行自定义的异常封装
自定义异常
需求:在本程序中除数为负数,也视为错误,无法进行运算
那么就需要对这个问题进行自定义的描述
当在函数内部出现throw抛出异常对象,那么就必须要给对应的处理动作
要么在内部try catch 处理
要么在函数上声明让调用者处理
一般情况下,函数类出现异常,函数上需要声明
发现打印的结果中只有异常的名称,却没有异常的信息
因为自定义的异常并未定义信息
如何定义异常信息呢?
因为父类已经把异常信息的操作都完成了
所以子类只要在构造时,将异常信息传递给父类通过super语句
就可以通过getMessage方法获取自定义的异常信息
自定义异常:
必须是自定义类继承Exception
继承Exception的原因:
异常体系有一个特点:因为异常类和异常对象都需要被抛出
他们都具备科抛性。这个可抛性是Throwable体系中独有的特点
只有这个体系中类和对象才可以被throws和throw多操作
throw和throws的区别
throws使用在函数上
throw使用在函数内
throws后跟异常类;可跟多个;用逗号隔开
throw后跟的是异常对象
代码演示:
- class FuShuException extends Exception
- {
- private String msg;
- FuShuException( String msg)
- {
- this.msg=msg;
- }
- public String getMessage()
- {
- return msg;
- }
- }
- class Demo
- {
- int div( int a , int b ) throws FuShuException
- {
- if (b<0)
- throw new FuShuException("出现了除数是负数的情况");
- return a/b;
- }
- }
- class ExceptionDemo2
- {
- public static void main(String[] args)
- {
- Demo d = new Demo();
- try
- {
- int x = d.div( 4,-1);
- System.out.println("x= "+x);
- }
- catch( FuShuException e)
- {
- System.out.println( e.toString());
- System.out.println("除数为负数了");
- }
-
- System.out.println("over ");
- }
- }
复制代码
Exception中有一个特殊的子类异常,RuntimeException
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常;调用者可以不用进行处理
之所以不用在函数上声明,是因为不需要调用者处理
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况
希望停止程序后,对代码进行修正
自定义异常时:如果该异常的发生,无法再继续进行运算
就让自定义异常类继承RuntimeException
对于异常分两种:
1,编译时被检测的异常
2,编译时不被检测的异常(运行时异常。RuntimeException及其子类 |