Java面向对象--异常(二)

来源:互联网 发布:华为mate9网络频段 编辑:程序博客网 时间:2024/06/05 09:18

在编写方法时不必将所有可能的异常抛出,在以下四种情况时则应抛出异常。

 1.调用一个抛出已经检查异常的方法,如IO流中的输入输出方法,后缀为Stream方法。

 2.程序运行过程中发现的错误,并且利用throw语句抛出一个已检查的异常。

 3.程序出现错误,例如 a[-1]=0会抛出一个ArrayIndexOutofBoundsException。

 4.Java虚拟机和运行时库出现的异常。

=============================================

一,抛出异常。

      1.声明已检测异常。

              遇到无法处理的情况,java的方法会抛出一个异常。声明检测异常是发生在编译阶段,主要是为了告诉编译器有可能发生什么错误。

对于那些可能被人使用的Java方法,就应该根据异常规范(exception specification),在方法的首部生命这个方法可能抛出的异常:

class MyExceptionDemo{.......     public Image loadImage(String s) throws IOexception{     ........   }}
  //如果一个方法有可能有多个已检测异常,那么就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。如下:

class MyAnimation
{
       public Image loadImage(String s) throws FileNotFoundException,EOFException
        {
         ..........
        }
}
// 但是不需要声明Java的内部错误,即从Error中继承的错误,任何程序代码都可以抛出Error异常,我们不能对其进行控制。同样,也不应该声明从RuntimeException继承的
//那些未检查异常
class MyAnimation
{
     ....
   void drawImage(int i) throws ArrayIndexOutOfBoundsException   //It's bad style
      {
      }
}     

如:IO流的IO异常在编写代码时就应抛出。

import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;
public class IOCopyTest {public static void main(String[] args) throws IOException {//1.读取一个已有的文本文件。使用字符读取流和文件相关联。FileReader fr= new FileReader("IO流_2.txt");//2.创建一个目的,用于存储读到的数据。FileWriter fw =new FileWriter("copytext_1.txt");        //3.频繁的读写操作。int ch=0; while((ch=fr.read())!=-1){fw.write(ch);}//4.关闭流资源fw.close();fr.close();}}
       2.抛出异常的方法。

     thtow new EOFException();  

或    EOFException e = new EOFException();    throw e;

效果如下:

String readData(Scanner in) throws EOFException{...   while(...)    {       if(!in.hasNext())//EOF encounted        {         if(n<len)            throw new EFOException;        }    }   return s;}
对于一个已经存在的异常类,将其抛出非常容易.在这种情况下"

(1). 找到一个合适的异常类

(2). 创建这个类的一个对象

(3). 将对象抛出

一旦方法抛出异常,这个方法就不能再返回调用者。

     3.throws 和throw的区别。

    1,throws使用在函数上。
          throw使用在函数内。
  2,throws抛出的是异常类,可以抛出多个,用逗号隔开。
          throw抛出的是异常对象。
二.捕获异常

     有些代码只需要抛出异常就可以了,但有些代码必须捕获异常

     异常处理的捕捉形式:
     这是可以对异常进行针对性处理的方式。

具体格式是:

try{//需要被检测异常的代码。}catch(异常类 变量)//该变量用于接收发生的异常对象{//处理异常的代码。}finally{//一定会被执行的代码。}
如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么

1.程序将跳过try语句块的其余代码。

2.程序将执行catch子句中的处理器代码.

      如果在try语句块中没有抛出任何异常,那么程序将跳过catch子句。
      如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。

例:


public coid read(String filename){     try{      InputStream in = new FileInputStream(filename);      int len;      while((len = in.read()!=-1){       process input     }    }    catch(IOException e){      e.priontStackTrace();    }}
   通常将异常传递给调用者,如果read方法出现了错误,最好的办法就是将read方法去进行调试,只需要将IOException抛出即可。
public void read(String filename) throws IOException{     InputStream in = new FileInputStream(filename);     int len;    while((len=in.read())!=-1){    process input }}
  


在一个try语句中可以捕获多个异常类型,并对不同类型的异常做出不同的处理,可以按照下列方式为每个异常类型使用一个catch子句。

try{code that might throw exception}catch(Exception e){  println e;}catch(Exception e2){  println e2;}catch(Exception e3){  println e3;}
finally子句可以不用在trycatch中编写,但是如果写了就一定会执行try catch语句


try catch finally 代码块组合特点:


1,
try catch finally


2,
try catch(多个)当没有必要资源需要释放时,可以不用定义finally。


3,
try finally 异常无法直接catch处理,但是资源需要关闭。 

void show()throws Exception
{
try
{
//开启资源。
throw new Exception();
}
finally
{
//关闭资源。

}

 三。自定义异常

     自定义异常继承自Exception和RuntiemeExceotion

public class MyException extends Exception{     public MyException(String msg)  {  super(msg);  }}
例:

public class MyException extends Exception{  public MyException(String msg)  {  super(msg);  }        publicstatic int Multiply(int n,int m) throws MyException{int re;re =n*m;if(re>1000)throw new MyException("结果re="+re+"超过了"+"1000");elseSystem.out.println("乘数:"+re);return re; } public static void main(String[] args){try{Multiply(500,100);}catch(MyException e){System.out.println(e.toString());}}}

四。总结:

  所有异常都是由Throwable继承而来,而Throwable往下可以分为Error和Exception。所有可以抛出的异常也都是Exception的子类。记清楚throws和throw之间的区别,以及trycatch语句块的用法。


原创粉丝点击