异常:就是不正常,是指程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。
出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
异常的体系 Throwable
Error
通常指JVM出现重大问题如:运行的类不存在或者内存溢出等。
不需要编写针对代码对其处理,程序无法处理。
Exception
在运行时运行出现的一些情况,可以通过try,catch,finally处理
异常处理两种方式:
1、捕获异常:try catch 直接处理可能出现的异常!
2、声明异常:throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理!
- class Demo{
- int dvs(int a ,intb){
- return a/b;}
- }
- class ExceptionDemo {
- public static void main(String[] args) {
- /*最开始的语句
- Demo d =newDemo();
- intx=d.dvs(4,0);
- System.out.println("x="+x);*/
- Demo d= new Demo();
- try{
- int x=d.dvs(4,0);
- System.out.println("x="+x);
- }
- catch (Exception A)
- {
- System.out.println("除数不为0");
- System.out.println(A.getMessage());// / by zero;
- System.out.println(A.toString());//异常名称:异常信息。
- A.printStackTrace();//异常名称,异常信息。异常出现的位置。
- //其实JVM异常处理机制默认就是printStackTrace方法
- //打印异常的堆栈的跟踪信息。
- }
自定义异常
1当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。 要么在内部try catch处理。要么在函数上声明让调用者处理。简明一句话:一般情况下,函数内出现异常,函数上需要声明。
2 必须是自定义类继承Exception。或者RuntimeException,一是为了让该自定义类具备可抛性,二是让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
classMyException excends Exception
{
MyException(String message)
{
super(message);
}
}
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象需要被抛出。
他么都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throw和throws操作。
(1)throws使用在函数上,throw使用在函数内。
(2)throws后面跟的是异常类,可以跟多个,用逗号隔开。throw后面跟的是异常对象。
注意:throw单独执行对象完毕,后面不要再加语句。因为执行不到。就像return后面不加语句一样。
RuntimeExceptiony异常
1 Exception中有一个特殊的子类异常RuntimeException运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明。编译一样通过。
如果在函数上声明该异常,调用者可以不用进行处理,编译一样通过。
2 之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
3 自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。
4 对于异常分两种:
(1)编译时被检测的异常。
(2)编译时不被检测的异常(运行时异常,RuntimeException以及其子类)
// 下面为另外一个RuntimeException例子
[java] view plaincopy
class FuShuException extends RuntimeException{
FuShuException(String message){
super(message);
}
}
class Demo{
int Div(int a,int b){
if(b<0)
throw new FuShuException("出现了除数为负数");
if(b==0)
throw new ArithmeticException("被零整除啦");
return a/b;
}
}
class ExceptionDemo5{
public static void main(String[] args) {
Demo d = new Demo();
int x = d.Div(4,-1);
System.out.println(x);
}
}
Finally最终都会执行的语句
假设:
class NoException
{
}
public void method()throws NoEception
{
连接数据库;
数据操作://shrow new SQLException();
关闭数据库://该动作,无论数据操作是否成功,一定要关闭资源。
}
try
{
连接数据库;
数据操作:
}
catch(SQlEception a)
{
会对数据库进行一次处理;
throw new NoException();
//抛出对外暴露可以识别的另外一个错误.
//比方说外部的销售科员要拿货这里的catch是仓
//库员处理的内容,他要处理货物的事情,因为销//售员只要知道有没有货,其他不是他的工作范
//围,那么catch仓库员就只抛出一个问题:就是
//告知销售员没货的问题就可以了。这就叫问题的封装
}
finally
{
关闭数据库
}
Finally代码块:定义一定执行的代码。通常用于关闭资源。
一种情况会执行不到就是在catch语句中定义了
System.exit(0); //属于系统退出。执行不到finally咯
---------------------- ASP.Net+Unity开发 、 .Net培训 、期待与您交流! ----------------------