概述
- 异常:就是程序在运行时出现不正常的情况.
- 异常的由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式描述,并封装成对象.
- 其实就是java对不正常情况进行描述后的对象体现.
-
- 对于问题的划分:两种:一种严重的问题.一种非常严重的问题.
- 对于严重的,java通过Error类进行描述.
- 对于Error一般不编写针对性的代码对其进行处理.
- 对于非严重的,java通过Exception可以使用针对性的处理方式进行处理.
-
- 无论Error或者Exception都具有一些共性内容.
- 如:不正常情况的信息,引发原因等.
-
- Throwable
- |–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
//throws Exception:在功能上通过throws的关键字声明了该功能有可能会出现问题.
{
int[] arr = new int[a];
System.out.println(arr[4]);
return a/b;
}
}
public class ExceptionDemo
{
public static void main(String[] args)//throws Exception
//throws Exception:抛出异常
{
Demo d = new Demo();
try//捕捉异常
{
int x = d.div(3,0);
System.out.println("x="+x);
}
catch(ArithmeticException e)//Exception e = new Exception();
{
System.out.println("除以零了,不能运算");
System.out.println("e.getMessate()");//异常信息 by zero
System.out.println("e.toString()");//异常名称,异常信息
e.printStackTrace();//异常名称,异常信息,异常出现的位置.
//其实jvm默认的异常处理机制,就是在调用printStacktrace()方法.
//打印异常的堆栈的跟踪信息.
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(e.toString());
System.out.println("脚标越界了");
}
System.out.println("over");
}
}
- 因为项目中会出现特有的问题,
- 而这些问题并未被java所描述并封装对象.
- 所以对于这些特有的问题可以按照java的对问题封装的思想.
- 将特有的问题,进行自定义的异常封装.
-
- 自定义异常:
- 需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的.
- 那么我们就要自己定义异常.
-
- 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作.
- 要么在内部try catch 处理.
- 要么在函数上声明让调用者处理.
-
- 一般情况在,函数内出现异常,函数上需要声明.
-
- 自定义异常信息:
- 因为父类中已经把异常信息的操作都完成了.
- 所以子类只要在构造时,将异常信息传递给父类通过super语句.
- 那么就可以直接通过getMessage()方法获取自定义的异常信息.
-
- 注意:自定义异常必须是自定义类继承Exception.
-
- 继承Exception原因:
- 异常体系有一个特点:因为异常和异常对象都被抛出.
- 它们都具备可抛性,这个可抛性是Throwable这个体系中的独有特点.
- 只有这个体系中的类和对象才可以被throws和throw操作
-
- throws和throw的区别:
- throws使用在函数上.
- throw使用在函数内.
- throws后面跟的是异常类,可以跟多个.用逗号隔开.
- throw后跟的是异常常对象.
-
- Exception中有一个特殊的子类异常RuntimeException:运行时异常.
- 如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过.
- 如果在函数内容上声明了该异常.调用者可以不用进行处理.编译一样通过.
-
- 之所以不用在函数声明,是因为不需要让调用者处理.
- 当该异常发生,希望程序停止.一维在运行时,出现了无法继续运算的情况,希望停止程序后,
- 对代码进行修正.
-
- 自定义异常时,如果该异常的发生,无法在继续进行运算.
- 就让自定义异常继承RuntimeException.
-
- 对于异常分两种:
- 1,编译时被检测的异常
- 2,编译时不被检测的异常(运行时异常,RuntimeException以及子类)
-
- finally代码块:
- 定义一定执行的代码.通常用于关闭资源.
- public void method()
- {
- try
- {
- 连接数据库;
- 操作数据库;//throw new SQLException();
-
- }
- catch(SQLException e)
- {
- 会对数据库进行异常处理;
- throw new NoException();
- }
- finally
- {
- 关闭数据库;
- }
- }
-
- catch是用于处理异常.如果没有catch就代表异常没有被处理过.
- 如果该异常是检测时异常,那么就必须声明.
-
- 异常在子父类覆盖的体现:
- 1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类.
- 2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集.
- 3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常.
- 如果子类方法发生了异常,就必须要进行try处理.绝对不能抛.
class FuShuException extends Exception//getMessage();
{
private int value;
FuShuException()
{
super();
}
FuShuException(String msg,int value)
{
super(msg);
this.value = value;
}
public int getValue()
{
return value;
}
}
class Demo1
{
int div1(int a,int b)throws FuShuException
{
if(b<0)
throw new FuShuException("出现了除数是负数的情况--/by fushu",b);
//手动通过throw关键字抛出一个自定义异常.
return a/b;
}
}
public class ExceptionDemo2
{
public static void main(String[] args)
{
Demo1 d = new Demo1();
try
{
int x = d.div1(3,-9);
System.out.println("x="+x);
}
catch(FuShuException e)
{
System.out.println(e.toString());
//System.out.println("除数是负数了");
System.out.println(e.getValue());
}
}
}
异常总结:
异常:是对问题的描述,将问题进行对象的封装.
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系中的特点:
异常体系中所有类以及建立的对象都具有可抛性.
也就是说可以被throw和throws关键字所操作.
只有异常体系具备这个特点.
throw和throws的用法:
throw定义在函数上,用于抛出异常对象.
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开.
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败.
注意:RuntimeException除外,也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明.
如果函数上声明了异常,调用者需要进行处理.处理方法可以throws可以try.
异常有两种:
编译时被检测异常,该异常在编译时,如果没有处理(没有抛也没有try),编译失败.
该异常被标识,代表着可以被处理.
运行时异常(编译时不检测),在编译时,不需要处理,编译器不检查.
该异常的发生,建议不处理,让程序停止,需要对代码进行修正.
finally中定义的通常是关闭资源代码,因为资源必须释放.
finally只有一种情况不会执行,当执行到System.txie(0);
自定义异常:
定义继承Exception或者RuntimeException
1,为了让该自定义具备可抛性.
2,让该类具备操作异常的共性方法.
当要自定义异常的信息时,可以使用父类已经定义好的功能.异常信息传递给父类的构造函数.
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
自定义异常:按照java的面向对象的思想,将程序中出现的特有问题进行封装.
异常的好处:
1,将问题进行封装.
2,将正常流程代码和问题处理代码相分离,方便于阅读.
异常处理原则:
1,处理方式有两种:try或者throws.
2,调用到抛出异常的功能时,抛出几个就要处理几个.一个try对象多个catch.
3,多个catch,父类的catch要放到最下面.
4,catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句,也不要不写.
{
throw new AException();
}
catch(AException e)
{
throw e;
}
如果并不属于该功能出现的异常,可以将异常转换后,在抛出和该功能相关的异常.
或者调用者知道,并处理,也可以将捕获异常处理后,转换新的异常.
try
{
throw new AException();
}
catch(AException e)
{
//对AException处理
throw new BException();
}
最后
以上就是时尚皮带为你收集整理的javaAPI(异常)的全部内容,希望文章能够帮你解决javaAPI(异常)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复