在编写方法时不必将所有可能的异常抛出,在以下四种情况时则应抛出异常。
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);
}
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语句块的用法。