在编写方法时不必将所有可能的异常抛出,在以下四种情况时则应抛出异常。
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子句中说明的异常类,那么try { //需要被检测异常的代码。 } catch(异常类 变量)//该变量用于接收发生的异常对象 { //处理异常的代码。 } finally { //一定会被执行的代码。 }
1.程序将跳过try语句块的其余代码。
2.程序将执行catch子句中的处理器代码.
如果在try语句块中没有抛出任何异常,那么程序将跳过catch子句。
如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。例:
通常将异常传递给调用者,如果read方法出现了错误,最好的办法就是将read方法去进行调试,只需要将IOException抛出即可。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(); } }
public void read(String filename) throws IOException{ InputStream in = new FileInputStream(filename); int len; while((len=in.read())!=-1){ process input } }
在一个try语句中可以捕获多个异常类型,并对不同类型的异常做出不同的处理,可以按照下列方式为每个异常类型使用一个catch子句。
finally子句可以不用在trycatch中编写,但是如果写了就一定会执行try catch语句try{ code that might throw exception }catch(Exception e){ println e; }catch(Exception e2){ println e2; }catch(Exception e3){ println e3; }
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语句块的用法。