论坛首页 入门技术论坛

corejava辅导(7--3)

浏览 1005 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-03  

finally关键字

 

finally{……}finally语句块中的代码无论如何都会运行

 

trycatch后还可以再跟一个finally块。finally块中的代码语句无论如何(无论有没有异常)都会执行(finally块多写一些释放资源,关闭连接的代码)。finally块中的代码在和try块中的代码的冲突时,finally块中的代码一定会执行且会忽略try块中的代码。但是System.exit(0);(虚拟机退出语句)后则不执行fianlly中的代码。

 

try{..}catch(..){..}

try{..}catch(..){..}finally{..}

try{..}finally{..}

以上三种写法都可以。

 

程序中抛出异常就要处理,无论是使用throws,还是用捕获是用trycatch,不对异常进行处理,编译不通过。

 

如何知道在编写的程序中会出现例外呢

1.调用方法,查看API中查看方法中是否有已检查错误。

2.在编译的过程中看提示信息,然后加上相应的处理。

 

Throwable有一个message属性。在使用catch的时候可以调用:

 

try{……}Catch(IOException e){System.out.println(e.message());}//异常的信息的显示

try{……}Catch(IOException e){e. printStackTrace();}//异常堆栈信息的显示

 

printStackTrace()方法是打印异常堆栈信息,是常用的异常处理的访法,它是异常的方法。

 

以上两条语句都可打印出错的信息。告诉我们出错类型及代码的运行过程,在调试的中非常有用。

 

例:

public class TestHundredException{

     public static void main(String[] args){

         MyClass mc=new MyClass();

         try{//在这个try语句块中抛出的异常会得到处理

              System.out.println(mc.add(10,80));

         }

         catch(HundredException e){

//捕获try块中抛出的异常

              e.printStackTrace();

         }

         try{

              System.out.println(mc.add(30,70));

         }

         catch(HundredException e){

              e.printStackTrace();

         }finally{

              System.exit(0);

         }

     }

}

class HundredException extends Exception{//自定义异常

     public HundredException(String message){

         super(message);

     }

}

 

class MyClass{

     public int add(int a,int b) throws HundredException{

         int c=a+b;

         if (c==100) {

throw new HundredException("a+b can\'t be 100");

else{

return c;

         }

     }

}

 

自定义异常

 

自定义异常要是Exception的子类,以下是一个例子:

自己定义异常类必须是Excepiton或者RuntimeException的子类。

 

public class TestMyException{

     public static void main(String[] args){

         int n=Integer.parseInt(args[0]);

         A a=new A();

         try{

              a.calculate(n);

         }

         catch(Exception e){

              e.printStackTrace();

         }

         System.out.println("OK");

     }

}

class A{

     public void calculate(int n) throws ZhiShuException{

         for(int i=2;i<n;i++){

              if (n % i == 0) return;

         }

         throw new ZhiShuException(n+" is a Prime Number");

     }

}

 

class ZhiShuException extends Exception{//自定义的异常,是Exception的子类

     public ZhiShuException(String message){

//注意在构造父类对象时需要String类型的message作为参数

         super(message);

     }

}

 

开发中的两个道理:

     如何控制try的范围:根据操作的连动性和相关性,前面的程序代码块抛出的异常影响了后面程序代码的运行,这两个段程序代码就存在关联,应该放在同一个try中。

 

     对已经查出来的例外,有throw(消极)try {…}catch(…){…}(积极)两种处理方法。对于throws把异常抛到try catch能够恰当地处理异常的位置(即放在具备对这个异常进行处理的能力的位置)。没有处理异常的能力就将异常继续上抛。

 

throw是一个语句,用来做抛出例外的功能。

throws是表示本方法中会异常抛出,本方法不做处理,将异常对象向上抛出。

throws写的是异常类型,throw后写的是要抛出的异常对象。

 

注意:方法的覆盖中,如果子类的方法抛出的例外是父类方法抛出的例外的父类型,那么编译就会出错:子类无法覆盖父类。

 

结论:子类方法不可比父类方法抛出更多的例外。子类抛出的例外或者与父类抛出的例外一致,或者是父类抛出例外的子类型。或者子类型不抛出例外。如果父类型无throws时,子类型也不允许出现throws。此时只能使用try catch

 

断言是一种调试工具(assert

 

其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,在屏幕上出现assert信息。

Assert只是用于调试。在产品编译完成后上线assert代码就被删除了。

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics