异常处理的常见手段
try catch
1.将有可能存在异常的代码放在放在try中
2.如果try中的代码没有异常,则继续执行代码,不会执行catch中的语句
3.如果try中的代码有异常,则try中的代码就会立刻终止,执行catch中的代码
4.e.printStrackTrace();会打印出方法调用的痕迹,这样便于定位和分析哪里出现了异常
下面的代码演示有可能抛出FileNotFoundException异常的处理
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 5 public class TestException { 6 7 public static void main(String[] args) { 8 9 File f= new File("d:/LOL.exe"); 10 11 try{ 12 System.out.println("试图打开 d:/LOL.exe"); 13 new FileInputStream(f); 14 System.out.println("成功打开"); 15 } 16 catch(FileNotFoundException e){ 17 System.out.println("d:/LOL.exe不存在"); 18 e.printStackTrace(); 19 } 20 21 } 22 }
使用异常的父类进行catch
FileNotFoundException是Exception的子类,使用Exception也可以catch住FileNotFoundException
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 5 public class TestException { 6 7 public static void main(String[] args) { 8 9 File f= new File("d:/LOL.exe"); 10 11 try{ 12 System.out.println("试图打开 d:/LOL.exe"); 13 new FileInputStream(f); 14 System.out.println("成功打开"); 15 } 16 17 catch(Exception e){ 18 System.out.println("d:/LOL.exe不存在"); 19 e.printStackTrace(); 20 } 21 22 } 23 }
多异常捕捉方法
有时候代码会抛出多个异常,比如:
1 new FileInputStream(f); 2 Date d = sdf.parse("2016-06-03");
这段代码,会抛出 文件不存在异常 FileNotFoundException 和 解析异常ParseException。解决办法之一是分别进行catch
1 catch (FileNotFoundException e) { 2 System.out.println("d:/LOL.exe不存在"); 3 e.printStackTrace(); 4 } catch (ParseException e) { 5 System.out.println("日期格式解析错误"); 6 e.printStackTrace(); 7 }
代码如下:
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 public class TestException { 9 10 public static void main(String[] args) { 11 12 File f = new File("d:/LOL.exe"); 13 14 try { 15 System.out.println("试图打开 d:/LOL.exe"); 16 new FileInputStream(f); 17 System.out.println("成功打开"); 18 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 19 Date d = sdf.parse("2016-06-03"); 20 } catch (FileNotFoundException e) { 21 System.out.println("d:/LOL.exe不存在"); 22 e.printStackTrace(); 23 } catch (ParseException e) { 24 System.out.println("日期格式解析错误"); 25 e.printStackTrace(); 26 } 27 } 28 }
finally
无论是否出现异常,finally中的代码都会执行
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 5 public class TestException { 6 7 public static void main(String[] args) { 8 9 File f= new File("d:/LOL.exe"); 10 11 try{ 12 System.out.println("试图打开 d:/LOL.exe"); 13 new FileInputStream(f); 14 System.out.println("成功打开"); 15 } 16 catch(FileNotFoundException e){ 17 System.out.println("d:/LOL.exe不存在"); 18 e.printStackTrace(); 19 } 20 finally{ 21 System.out.println("无论文件是否存在, 都会执行的代码"); 22 } 23 } 24 }
throws
考虑如下情况:
主方法调用method1
method1调用method2
method2中打开文件
method2中需要进行异常处理
但是method2不打算处理,而是把这个异常通过throws抛出去
那么method1就会接到该异常。 处理办法也是两种,要么是try catch处理掉,要么也是抛出去。
method1选择本地try catch住 一旦try catch住了,就相当于把这个异常消化掉了,主方法在调用method1的时候,就不需要进行异常处理了
代码如下:
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 5 public class TestException { 6 7 public static void main(String[] args) { 8 method1(); 9 10 } 11 12 private static void method1() { 13 try { 14 method2(); 15 } catch (FileNotFoundException e) { 16 // TODO Auto-generated catch block 17 e.printStackTrace(); 18 } 19 20 } 21 22 private static void method2() throws FileNotFoundException { 23 24 File f = new File("d:/LOL.exe"); 25 26 System.out.println("试图打开 d:/LOL.exe"); 27 new FileInputStream(f); 28 System.out.println("成功打开"); 29 30 } 31 }
throw和throws的区别
1. throws 出现在方法声明上,而throw通常都出现在方法体内。
2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象