`
javappx
  • 浏览: 9913 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

黑马程序员-面向对象:异常

阅读更多

 ------- android培训java培训、期待与您交流! ----------

 

程序执行时经常会出现一些意外的情况,这些意外的情况会导致程序出错或者崩溃,从而影响程序的正常执行,如果不能很好的处理这些意外情况,将使项目的稳定性不强。对于这些程序执行时出现的意外情况,在Java语言中被称作异常(Exception),出现异常时相关的处理则称之为异常处理。

 

 

异常处理是Java语言中的一种机制,恰当使用异常处理可以使整个项目更加稳定,也使项目中正常的逻辑代码和错误处理的代码实现分离,便于代码的阅读和维护。

 

 

 

 异常体系的根类是:Throwable

  

Throwable:

|--Error:重大的问题,我们处理不了。也不需要编写代码处理。比如说内存溢出。

|--Exception:一般性的错误,是需要我们编写代码进行处理的。

|--RuntimeException:运行时异常,这个我们也不需要处理。

                   其实就是为了让他在运行时出问题,然后我们回来修改代码。

 

 

 

Throwable中的方法

 

 

getMessage()

获取异常信息,返回字符串。

toString()

获取异常类名和异常信息,返回字符串。

printStackTrace()

获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

printStackTrace(PrintStream s)

通常用该方法将异常内容保存在日志文件中,以便查阅。 

 

 

1、Error类

该类代表错误,指程序无法恢复的异常情况。对于所有错误类型以及其子类,都不要求程序进行处理。常见的Error类例如内存溢出StackOverflowError等。

2、Exception类

该类代表异常,指程序有可能恢复的异常情况。该类就是整个Java语言异常类体系中的父类。使用该类,可以代表所有异常的情况。

 

 

RuntimeException及其所有子类

 

该类异常属于程序运行时异常,也就是由于程序自身的问题导致产生的异常,例如数组下标越界异常ArrayIndexOutOfBoundsException等。

 

该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现语法错误。

 

其它Exception子类

 

该类异常属于程序外部的问题引起的异常,也就是由于程序运行时某些外部问题导致产生的异常,例如文件不存在异常FileNotFoundException等。

 

该类异常在语法上强制程序员必须进行处理,如果不进行处理则会出现语法错误。

 

 

 /*

异常exception:就是程序在运行时出现不正常情况

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象

 

       其实就是java对不正常情况进行描述后的对象体现

 

 

对于问题的划分:两种,严重的和非严重的

对于严重的,java通过error类进行描述

       对于Error一般不编写针对性的代码对其进行处理

对于非严重的,java通过exception类进行描述

       对于Exception可以通过使用针对性的处理方式进行处理

 

无论errorexception都有共性内容:

比如:不正常情况的信息,引发原因等

 

THROWABLE

       |--Error

       |--Exception

 

 

 

 

2,异常的处理

 

java 提供了特有的语句进行处理

try

{

       需要被检测的代码

}

catch(异常类,变量)

{

       处理异常的代码:处理方式

}

finally

{

       一定会执行的语句;

}

 

 

 

3.对捕获到的异常对对象进行常见方法操作。

       String getMessage();获取异常信息

 

 

 

*/

 

 

 

如果声明了异常THROWS

 

06 异常处理

 

try

{

       需要被检测的代码

}

catch(异常类,变量)

{

       处理异常的代码:处理方式

}

finally

{

       一定会执行的语句;

}

 

class Demo
{
       int div(int a,int b) throws Exception //在功能上通过throws的关键字声明了该功能可能会出现问题
       {
              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 (Exception e)//有问题,就返回一个Exception类型的异常,如果没有,catch就不执行
              {
                     System.out.println("除零了!");//Excepiton e = new ArithmenticExcepiton(计算异常分析)()多态调用
                     System.out.println(e.getMessage());// / by zero;
                     System.out.println(e.toString());//异常信息 名称.信息字符串表现形式
                     e.printStackTrace();//打印堆栈中的异常信息,名称和位置--返回值为void,不能在输出语句中
 
                     //其实JVM默认的异常处理机制,就是在调用printStackTrace()打印堆栈跟踪的异常信息
              }
              System.out.println("over");
       }
}
 

 

 

07 异常声明  throws

 

 

 

class Demo
{
       int div(int a,int b) throws Exception //在功能上通过throws的关键字声明了该功能可能会出现问题
       {
              return a / b;
       }
}
 
class  ExceptionDemo1
{
       public static void main(String[] args)  //throws Exception 抛回给虚拟机
       {
              Demo d = new Demo();
              try//自己处理
              {
                     int x = d.div(4,0);
                     System.out.println("x = " + x);
              }
              catch (Exception e)
              {
                     System.out.println(e.toString());
              }
              System.out.println("over");
       }
}
 

 

 

 

 

08 多异常处理 

 

 

/*

对多异常的处理

1.声明异常时,建议声明更为具体的异常,这样处理的可以更具体

2.对方声明有几个异常,就对应有几个catch,不要定义多余的catch

  1.   如果多个catch块中的异常出现继承关系,父类异常catch放在最下面catch(Exception e)

 

建议在进行catch处理时,catch中一定要定义具体处理方式

不要简单定义一句e.printStackTrace()

也不要简单输出一条语句

*/

class Demo
{
       int div(int a,int b) throws ArithmeticException, ArrayIndexOutOfBoundsException //在功能上通过throws的关键字声明了该功能可能会出现问题
       {
              int[] arr = new int[b];
              System.out.println(arr[4]);
              return a / b;
       }
}
 
class  ExceptionDemo2//throws Exception 抛回给虚拟机
{
       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)
              {
                     System.out.println(e.toString());
                     System.out.println("被零除了!!");
              }
              catch (ArrayIndexOutOfBoundsException e)
              {
                     System.out.println(e.toString());
                     System.out.println("越界了!!");
              }
              System.out.println("over");
       }
}
 

 

 

 

09 自定义异常

 

/*

因为项目中会出现特有问题:

而这些问题并未被java异常处理机制所描述并封装对象

所以对于这些特有的问题可以按照java的对问题封装的思想

将特有的问题,进行自定义的异常封装

 

自定义异常

 

需求:在本程序中,对于除数为负数也视为错误的

那么就需要对这个问题进行自定义的描 述

 

当在函数内部出现了throw抛出异常对象,那么必须给出对应的处理动作,这时编译一般到了最后一个环节

要么在内部try catch处理

要么在函数上声明让调用者处理

 

一般情况在,函数内出现异常,函数上需要声明

 

发现打印的结果中只有异常的名称,却没有异常的信息

因为自定义的异常并未定义信息

 

如何定义异常信息呢?

因为父类已经把异常信息的操作都完成了

所以子类只要在构造时,将异常信息传递给父类 通过super语句

就可以直接getMessage方法获取自定义异常信息了

 

自定义异常:

必须是自定义类继承Exception

 

继承Exception原因:

异常体系有一个特点:异常类和异常对象都需要被抛出,

他们都具备可抛性,这个可抛性是Throwable这个体系中的独有特点

 

只有这个体系中的类和对象才可以被thorwsthorw操作

 

thorwsthrow区别:

thorws使用在函数上

thorw使用在函数内

 

thorws后面跟的是异常类,可以跟(多个)异常类,可以用逗号隔开

throw跟的是异常对象 thorw new FuShuException

 

 

*/

class FuShuException extends Exception
{
       /*private String msg;
       FuShuException(String msg)
       {
              this.msg = msg;
       }
       public String getMessage()
       {
              return msg;
       }*/
       private int value;
 
      
       FuShuException(String msg,int value)
       {
              super(msg);
              this.value = value;
       }
       public int getValue()
       {
              return value;
       }
}
 
 
class Demo
{
       int div(int a,int b) throws FuShuException
       {
              if (b < 0)
                     throw new FuShuException("出现了",b);//自定义异常只能手动抛出, 手动通过throw关键字抛出一个自定义异常
              return a / b;
       }
}
 
class  ExceptionDemo3
{
       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("出现负数了!" + e.getValue());
              }
              System.out.println("没有了!!");
       }
}
 

 

 

 

11 runtimeException

 

 

 

/*

Exception中有一个特殊的子类异常RuntimeException 运行时异常

 

如果在函数内部抛出该异常,函数上可以不用声明,编译一样通过

 

如果在函数上声明了该异常,调用者可以不用处理,编译一样通过

 

注意:之所以不用在函数上声明,是因为不需要让调用者处理,

当该异常发生,希望程序停止因为在运行时出现了无法运算的情况

希望停止程序后希望程序员对代码进行修正

 

自定义异常时,如果该异常的发生,如果在异常发生时无法继续运算时

就让自定义异常继承RuntimeException

 

 

 

自定义异常时有两中选择,RuntimeException,Exception

1.编译时被检测的异常

 

2.编译时不被检测的异常(运行时异常RuntimeException及其子类)

 

*/

class FuShuException extends RuntimeException
{      private int num;
       FuShuException(String msg,int num)
       {
              super(msg);
              this.num = num;
       }
       public int getValue()
       {
              return num;
       }
}
 
class Demo
{
       int div(int a,int b) //throws FuShuException, ArithmeticException
       {
              if (b == 0)
                     throw new Exception("被零除啦!!");//手动通过throw关键字抛出一个自定义异常
              if (b < 0)
                     throw new FuShuException("除数为负数!!",b);
              return a / b;
       }
}
 
class  ExceptionDemo4
{
       public static void main(String[] args) 
       {
              Demo d = new Demo();
             
              int x = d.div(4,-1);
              System.out.println("x = " + x);
       }
}
 

 

 

12 异常练习

 

 

 

/*

需求:毕老师用电脑上课

 

开始思考上课中出现的问题

 

比如:电脑蓝屏

              电脑冒烟

要对问题进行描述,封装成对象

 

 

 

可是当冒烟发生时,出现讲课进度无法继续

 

出现了讲师的问题,课时计划无法完成

*/

class LanPingException extends Exception
{
       LanPingException(String msg)
       {
              super(msg);
       }
}
class MaoYanException extends Exception
{
       MaoYanException(String msg)
       {
              super(msg);
       }
}
class NoPlanException extends Exception
{
       NoPlanException(String msg)
       {
              super(msg);
       }
}
class Computer
{
       private int state = 3;
       public void run() throws LanPingException,MaoYanException
       {
              if (state == 2)
                     throw new LanPingException("蓝屏了!!");
              if (state == 3)
                     throw new MaoYanException("冒烟了!!");
              System.out.println("电脑运行");
       }
       public void reset()
       {
              state = 2;
              System.out.println("电脑重启");
       }
}
 
 
 
class Teacher
{
       private String name;
       private Computer cmpt;
       Teacher(String name)
       {
              this.name = name;
              cmpt = new Computer();
       }
       public void prelect()throws NoPlanException
       {
              try
              {
                     cmpt.run();
              }
              catch (LanPingException e)
              {
                     cmpt.reset();
              }
              catch (MaoYanException e)
              {
                     test();
                     throw new NoPlanException("课时无法继续"+e.getMessage());
              }
              System.out.println("讲课");
      
       }
       public void test()
       {
              System.out.println("讲课");
       }
}
 
 
 
 
 
class  ExceptionTest
{
       public static void main(String[] args) 
       {
              Teacher t = new Teacher("毕老师");
             
              try
              {
                     t.prelect();
              }
              catch (NoPlanException e)
              {
                     System.out.println(e.toString());
                     System.out.println("换老师或者放假");
              }
       }
       public void test()
       {
              System.out.println("练习");
       }
}
 

 

 

 

 

10.01   异常 -finally

 

 

/*

finally代码块:定义一定执行的代码

 

通常用于关闭资源(关闭数据库等)

*/

 

class FuShuException extends Exception
{
       private int value;
 
       FuShuException(String msg,int value)
       {
              super(msg);
              this.value = value;
       }
       public int getValue()
       {
              return value;
       }
}
 
 
class Demo
{
       int div(int a,int b) throws FuShuException
       {
              if (b < 0)
                     throw new FuShuException("出现了",b);//手动通过throw关键字抛出一个自定义异常
              return a / b;
       }
}
 
class  ExceptionDemo5
{
       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());
                     return;
              }
              finally
              {
                     System.out.println("finally");//finally中存放的是一定会被执行的代码
              }
              System.out.println("没有了!!");
       }
}
 

 

 

 

 

 

10.02  异常处理语句其他格式

 

 

 

 

//第一个格式

try

{

      

}

catch ()

{

}

//第二个格式

try

{

      

}

catch ()

{

}

finally

{

}

//第三个格式

try

{

      

}

finally

{

}

//记住一点,catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是检测时异常就必须要声明

 

 

class Demo

{

       public void method()//问题被内部解决,就没有必要在函数外部声明

       {

              try

              {

                     throw new Exception();

              }

              finally

              {

                     //关闭资源

              }

             

       }

}

 

class  

{

       public static void main(String[] args) 

       {

              System.out.println("Hello World!");

       }

}

 

 

 

10.03 异常-覆盖时的异常特点

 

 

 

/*

异常在子父类覆盖中的体现:

1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类

2.如果父类抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集

3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常

       如果子类发生了异常,就必须要进行try处理,绝对不能抛(非常常见)

*/

 

 
class AException extends Exception
{
}
 
class BException extends AException
{
}
 
class CException extends Exception
{
}
————————————————————————————————
class Fu
{
       void show() thorws AException
       {}
}
 
class Zi extends Fu
{
       void show() throws AException//后者抛出B异常,不能抛出C异常
       {
              //抛出C异常只能内部处理
       }
}
————————————————————————————————
class Test
{
       void function(Fu f)
       {
              try
              {
                     f.show;
              }
              catch (AException e)
              {
              }
       }
}
 
class  
{
       public static void main(String[] args) 
       {
              Test t = new Test();
              t.function(new Fu());
       }
}
 

 

 

 

10.04 异常 。练习

 

/*

有一个圆形和长方形

都可以获取面积,对于面积如果出现非法的数值,视为是获取面积出现问题

问题通过异常来表示

 

基本程序设计:

 

*/

class NoValueException extends RuntimeException
{
       NoValueException(String msg)
       {
              super(msg);
       }
}
interface Shape
{
       void getArea();
}
 
class Circle implements Shape
{
       private int radius;
       public static final double PI = 3.14;
 
       Circle(int radius) //throws NoValueException
       {
              if (radius <= 0)
                     throw new NoValueException("非法");
              this.radius = radius;
       }
       public void getArea()
       {
              System.out.println(radius * radius * PI);
       }
}
class Rec implements Shape 
{
       private int len,wid;
       Rec(int len,int wid) //throws NoValueException
       {
              if (len <= 0 || wid <= 0)
                     throw new NoValueException("出错了");
              this.len = len;
              this.wid = wid;
             
             
             
              //问题处理流程和正常流程代码结合紧密,可修改性很差
       }
       public void getArea()
       {
              System.out.println(len * wid);
       }
}
class  ExceptionTest1
{
       public static void main(String[] args) 
       {
              Rec c = new Rec(3,4);
              c.getArea();
 
              Circle d = new Circle(-8);
             
              System.out.print("over");
       }
}
 

 

 

10.05 异常  总结

 

 

 

异常:

是什么?是对问题的描述,将问题进行对象的封装

---------------------

异常体系:

       Throwable

              --Error

              --Excepiton

                     --RuntimeException

---------------------

异常体系的特点:

异常体系中的所有类以及建立的对象都具备可抛性

       也就是说可以被throwsthrow关键字所操作

              只有异常体系具备这个特点

---------------------

throwsthrow的用法:

throw定义在函数内,用于抛出异常对象

throws定义在函数上,用与抛出异常类,可以抛出多个用逗号隔开

 

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明

注意:RuntimeException除外,也就是说,函数内如果抛出的RuntimeExcepiton异常,函数上可以不用声明

 

如果函数声明了异常,调用者需要进行处理,处理方法可以throws也可以try

---------------------

异常有两种:

       编译时被检测异常

              该异常在编译时,如果没有处理(没有抛也没有try),编译失败

              该异常被标识,代表可以被处理

       运行时异常(编译时不检测)

              在编译时,不需要处理,编译器不检查

              该异常的发生,建议不处理,让程序停止,需要对代码进行修正

---------------------

异常处理的语句:

try

       需要被检测的代码;

catch(处理异常的代码)

finally//System.exit(0);  JVM系统推出,这是finally代码不会执行

       一定会执行的语句

 

有三种格式

 

注意:

1.finally定义的通常是关闭资源代码,因为资源必须释放

2.finally只有一种情况不会执行,当执行到System.exit(0)finally不会执行

---------------------

自定义异常:

       定义类继承Exception或者RuntimeException

       1.为了让该自定义类具备可抛性

       2.让该类具备操作异常的共性方法

 

       当要定义自定义异常的信息时,可以使用父类已经定义好的功能

       子类异常信息传递给父类的构造函数,用super关键字

自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装

---------------------

异常的好处:

       1.将问题进行封装

       2.正常流程代码和问题处理代码相分离,方便于阅读

 

异常的处理原则:

       1.处理方式有两种:try或者throws

       2.调用到抛出一场的功能时,抛出几个,就处理几个

       一个try对应多个catch

       3.多个catch,父类的catch放到最下面

       4.catch,需要定义针对性的处理方式,不要简单的定义iprintStackTrace,输出语句

       也不要不写

       当捕获到的异常,本功能处理不了时,可以继续再catch中抛出

       如果该异常处理不了,但并不属于该功能出现的异常,

       可以将该异常转换后,再抛出和该功能相关的异常(冒烟问题,仓库取货问题)

      

       或者异常可以处理,但需要将异常产生后和本功能相关的问题提供出去

       让调用者知道,并处理,也可以将捕获异常处理后,转换新的异常

      

       try

       {

              throw new AException();

       }

       catch (AException e)

       {

              throw new BExceptin();

       }

       比如,汇款的例子

---------------------

异常的注意事项:

       在子父类覆盖时:

       1.子类抛出的异常必须是父类异常的子类或者子集

       2.如果父类或者接口异常抛出时,子类覆盖出现异常时,只能try不能抛

---------------------

参阅

ExceptionTestjava 老师用电脑上课

ExceptionTest1.java 图形面积

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics