黑马程序员---(学习日记——异常)java中的异常机制

来源:互联网 发布:淘宝热卖网 编辑:程序博客网 时间:2024/05/21 11:14

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------​

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------​

设计程序时产生错误是不可避免的,一般计算机会给出信息,但不提供善后处理。java引进异常处理机制,使用户可以控制意外,提供适当的处理,从而大大提高了软件的可靠性 
程序错误有三种:
1.编译错误
在编译程序时产生错误
没有编译错误是每个程序可正常运行的基本条件,因为只有编译错误改正后,程序才被编译为目标代码或字节码
2.逻辑错误
指程序不能按预期的方案执行,机器本身无法检测,需人工对运行结果及程序逻辑进行分析,找出错误原因
3.运行错误
程序在运行中产生的错误,这类错误可能来自程序员没有预料到的各种情况,或者超出程序员控制的各种因素
一、异常处理知识
异常(exception)是特殊的运行错误
其定义是:在程序执行的时候,所发生的会中断程序正常执行的错误。
如除0、溢出、数组下标越界、不能打开指定的文件等。

1、异常类

Java的异常类是处理运行错误的特殊类,每一种异常类都对应一种特定的运行错误(异常),一旦程序运行中出现异常,运行时系统会产生一个相应异常类对象。
Java通过系统类库中的Error类和Exception类及其大量的子类来描述异常,它们都是Throwable类的子类。
(1)Error类
该类所描述的异常对象是由Java虚拟机生产并抛给
    系统,如内存溢出,链接错误等,一般 Java程序不
     对这类运行错误进行处理,直接交给运 行时系统处理。
(2)Exception类
它的各种不同的子类分别对应着不同的异常类型,
    如,除数为0、数组下标越界等运行时产生的错误,
    每种异常对象(描述运行错误的对象)
    都对应着 一个异常类。
例:数组下标越界
public class ExceptionArry{  public static void main (String args[]){      int index=0;      int a_array[] = {1,2,3,4,5};      for(index=0;index<=5;index++)          prt("a["+index+"]="+a_array[index]);       prt("the end");  }  public static void prt(String s){     System.out.println(s);   }} 



2、异常处理机制

Java的异常处理机制是通过面向对象的方法处理异常
(1).抛出异常
当程序发生异常时,不能正常执行,称为“抛出(throw)”一个异常;
一个异常可以由jvm自动生成,也可以由程序中的方法产生
异常对象包含了错误类型与相应的错误信息
(2)、处理异常
Java在异常处理机制中使用try-catch-finally语句来捕获处理一个或多个异常对象,语法格式:

try{

            可能发生错误的代码;

}

catch(Exception  e){     错误处理代码;

}

finally{      最后要执行的代码;

}

try-catch-finally语句:
Øtry
   {
     可能产生异常的代码;
  }
  catch (exceptiontype1  e)
    {异常e的处理语句}
  catch (exceptiontype2  e)
    { 异常 e的处理语句}
  catch (exceptiontype3  e)
    {异常 e的处理语句 }
  finally
      {
         最终的处理
  } 
例:使用try-catch-finally处理被零除异常

public class CatchExceptDivideByZero { public static void main(String args[]) {   try {        inti,j = 0;       i= 3 / j;                     //可能产生异常的语句置于try子句   }   catch(ArithmeticException e) {    //捕获算术异常      System.out.println("发生被零除异常.....");   }   finally {                         //无论是否发生异常都要执行该子句      System.out.println("\nEnd!");      System.out.println("\n程序继续执行,可正常结束!");   } }} 

例:使用try-catch-finally捕获多个异常

public class Try2{ public static void main (String args[])  { int i=0;   int a[] = {5,6,7,8};    for(i=0;i<5;i++)    { try {System.out.print("a["+i+"]/"+i+"="+(a[i]/i));  }      catch(ArrayIndexOutOfBoundsException e)        { System.out.print("捕获数组下标越界异常!");  }      catch(ArithmeticException e)         {  System.out.print("捕获算术异常!");  }      catch(Exception e)         { System.out.print("捕获"+e.getMessage()+"异常!"); }       finally         { System.out.println("  finally  i="+i); }     }        System.out.println("继续!");    }}

注意:

1、当产生异常对象时,从第一个catch子句开始匹配,直到向下找到一个可匹配的子句,剩下的catch语句就不再进行匹配也就是捕获子类异常的catch语句在前,捕获超类异常的catch语句在后。 
2、finally子句为异常处理提供一个统一的出口,无论try语句是否产生异常,都将执行finally子句;
3、当try子句中的语句产生异常时,其后面的语句将无法执行,在编程时可以把这部分代码放在finally子句的语句块中,以保证程序能正常执行或正常退出同时,finally子句应该包含用于释放在try语句块中所获取的资源的代码,如,finally子句应该关闭在try子句中打开的所有的文件当然也可以缺省finally子句



常见的公用异常类

Ø介绍常见的异常类,它们都是RuntimeException的子类
1.ArithmeticException----算术异常
如果除数为0或被0取模产生该异常
2.NullPointerException       数据未初始化异常
如果程序试图访问一个空对象的变量与方法,或一个空数组的元素时,产生该异常,如
      int a[]=null;
      a[0]=0;    //访问长度为0的数组,产生异常
     String str=null;
      System.out.println(str.length()); //产生异常
3.ClassCastException----强制类型转换
无法强制类型转换的操作,在进行强制类型转换时会出现此异常,如
Object obj=new Object();
String str=(String) obj; 
对象obj不能强制转换为String ,产生该异常
4.ArrayIndexOutOfBandsException—数组下标越界
试图访问数组中不不存在的元素时,引发该异常,如
 int a=new int[1];
 a[0]=0;
 a[1]=1;//下标越界,产生异常
5.NegativeArraySizeException—数组负下标越界
如果一个数组的长度是负数,则产生异常,如
inta[]=new int[-1];  //数组长度不能为负,产生异常
三、抛出异常
在异常处理机制中, try语句必须有代码产生一个异常对象并把它抛出,   catch语句捕获一个异常对象。而抛出异常对象,即可以是java运行时系统异常;也可以是程序员自己编写的代码;
1.使用throw语句抛出异常
Øthrow抛出异常的格式如下:
throw <异常对象>;
其中,throw是关键字,异常对象是创建的异常类对象
2.抛出异常的方法与调用异常的方法处理异常
在实际的编程中,一个方法并不需要处理它所产生的异常,而是向上传递,由调用它的方法处理异常;
那么与异常有关的就有两个方法:
抛出异常的方法;
处理异常的方法
①抛出异常的方法
如果在一个方法中产生异常并不处理,那么就需要使用throws语句,用来抛出所产生的异常;
带有throws语句的方法声明如下:
返回类型 方法名(参数列表) throws  异常类列表;
其中, throws是关键字,异常类列表中可以有多个异常类,用逗号隔开;
抛出异常的方法并不处理异常
例:
public class  Ts{public void  go(int i) throws  Exception{if (i>0){throw  new Exception("over  boounds");}System.out.println("产生异常!");}public static void main(String[] args) {Ts   x=newTs();                       try{x.go(10);}                       catch(Exception  e){                             System.out.println(e.toString()); }     }}

例:throws的使用。

public class Ex{  public static voidTest(String x,String y)throws NumberFormatException,ArithmeticException  {  inta=Integer.parseInt(x);      int b=Integer.parseInt(y);      System.out.println(a/b);  }  public static voidmain(String[] args)  {      try      {      Test(args[0],args[1]);      }      catch(NumberFormatException e)      {      System.out.println("数据转换异常");      }      catch(ArithmeticException e)      {      System.out.println("捕获算术异常");      }      finally      {      System.out.println("继续运行其他代码");      }       } }

四、自定义异常

由于程序的复杂性,Java系统虽然已经定义了很多异常类,但有些情况下程序员必须自己定义那些未被系统定义的异常;
程序员可通过Exception类创建自己的异常类。
程序代码如下:
Ø自定义异常类

class OverflowException extendsException

{

    public void printMsg()

    {

        System.out.println("exception:"+this.getMessage());

        this.printStackTrace();

        System.exit(0); //终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非零的状态码表示异常终止

    }

}

例 :
public class Try7{  public void calc(byte k) throws OverflowException {       byte  y=1, i=1;     System.out.print(k+"!=");        for (i=1;i<=k;i++)        {   if(y>Byte.MAX_VALUE/i)                throw new OverflowException();            else    y = (byte)(y * i);        }        System.out.println(y);    }    public void run(byte k) {        try  {     calc(k);    }        catch(OverflowException e)        {   e.printMsg(); }    }    public static void main (String args[])    {   Try7 a = new Try7();        for (byte i=1;i<10;i++)    a.run(i);    }}

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>


0 0
原创粉丝点击