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

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

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

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

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

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

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

一,抛出异常。

      1.声明已检测异常。

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

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

扫描二维码关注公众号,回复: 3380854 查看本文章
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);
	  }
   
     public	static int Multiply(int n,int m) throws MyException{
		int re;
		re =n*m;
		if(re>1000)		
			throw new MyException("结果re="+re+"超过了"+"1000");		
		else
			System.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语句块的用法。


猜你喜欢

转载自blog.csdn.net/Anddown/article/details/77621609