java异常处理

来源:互联网 发布:c语言表白代码爱心 编辑:程序博客网 时间:2024/05/20 13:39

1.try catch

    尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常。这样做有两个好处。第一,它允许你修正错误。第二,它防止程序自动终止。大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说)。幸运的是,这很容易避免。为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句

public class Test_try {
 //这表示 fun方法可能会丢异常出来,那么在调用fun的时候就会做好准备
 static int fun(int a,int b) throws ArithmeticException{ 
  int c=a/b;
  return c;
 }
 public static void main(String args[]){
  int age=0;
  try{
   age=-100;
   if(age<0){
            //throw作用手动抛出异常,此类异常在jvm看来并非异常而在程序员看来则是异常
    Exception e = new Exception();
    throw e;
   }
  }catch(Exception e){  // 捕获异常
   System.out.println("age must >0 "+e);//显示异常信息
  }
  try{
   int i = fun(2,0);
   System.out.println("i is "+i);
  }catch(ArithmeticException e){
   System.out.println("exception "+e);
  }
 }
}
2.throw

在java代码中如果发生异常的话,jvm会抛出异常对象,导致程序代码中断,这个时候jvm在做的操作就是:创建异常对象,然后抛出,比如:
int i= 1;
int j = 0;
int res = 0;
res = i/j;//除0错误
System.out.println(res);

这5句代码运行到第四句会中断,因为jvm抛出了异常

////throw的作用/////////////////////////////////////////
手动抛出异常

但是有时候有些错误在jvm看来不是错误,比如说
int age = 0;
age = -100;
System.out.println(age);
很正常的整形变量赋值,但是在我们眼中看来就不正常,谁的年龄会是负的呢。
所以我们需要自己手动引发异常,这就是throw的作用
int age = 0;
age = -100;
if(age<0)
{
    Exception e = new Exception();//创建异常对象
    throw e;//抛出异常
}
System.out.println(age);


3.throws

////throws的作用///////////////////////////////////
声明方法可能回避的异常

    有异常被抛出了,就要做处理,所以java中有try-catch
    可是有时候一个方法中产生了异常,但是不知道该怎么处理它,那么就放着不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样,这种情况称为回避异常

    但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常
void fun()throws IOException,SQLException
{
...
}
这表示 fun方法可能会丢两个异常出来,那么在调用fun的时候就会做好准备,比如可以这样
try
{
fun();
}catch(IOException e)
{
}catch(SQLException e)
{
}


4.finally

finally 关键字是对 Java 异常处理模型的最佳补充。 finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。如果没有 finally,您的代码就会很费解。例如,下面的代码说明,在不使用 finally 的情况下您如何编写代码来释放非内存资源:
 
public void writeFile(String filePath, String fileName, String args)
 
throws IOException 
{
FileWriter fw = new FileWriter(filePath + fileName);
try {
fw.write(args);

} catch (IOException e) {

//1

fw.close();

throw e;

}

//2

fw.close();

}
这段代码创建了一个FileWriter object,并调用 write 方法。在退出该方法之前,您必须关闭FileWriter object,以避免资源漏洞。为了完成这一任务,我们在 //2 处调用 close,它是该方法的最后一条语句。但是,如果 try 块中发生一个异常会怎么样呢?在这种情况下,//2 处的 close 调用永远不会发生。因此,您必须捕获这个异常,并在重新发出这个异常之前在 //1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭FileWriter object。这样编写代码既麻烦又易于出错,但在没有 finally 的情况下这是必不可少的。有了 finally,前面的代码就可以重写为以下的形式:
 
public void writeFile(String filePath, String fileName, String args)
 
throws IOException
{
    FileWriter fw = new FileWriter(filePath + fileName);
    try {
        fw.write(args);
    } catch (IOException e) {
        throw e;
    } finally {
         fw.close();

    }
}
finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信FileWriter object被关闭并且您没有泄漏资源。

原创粉丝点击