先普及下什么是异常:
异常就是程序非正常结束,不按我们的处理逻辑执行下去了 导致程序中断的情况。
一般来说,一开始写程序犯错基本上就是 空指针NullPointerException 数组越界 参数异常
其实Java添加异常处理机制 是为了把异常和正常代码隔离开来,保证程序的健壮性和完整性
首先看段代码
public static void main(String[] args){ try { ArrayList<Integer> nin = new ArrayList<Integer>(); nin.add(312); nin.add(3122); nin.add(3112); System.out.println(nin.get(8)); } catch (Exception e) { System.out.println("Exception"); e.printStackTrace(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException"); e.printStackTrace(); } }
哎....我去 代码会编译不过去。
public static void main(String[] args) throws NullPointerException { show(); } public static int[] nu = null; public static void show() { System.out.println(doSomething()); try { System.out.println(nu[3]); } catch (NullPointerException e) { System.out.println("NullPointerException -"); e.printStackTrace(); }catch (Exception e) { System.out.println("Exception -"); e.printStackTrace(); } }
输出结果:
NullPointerException -
java.lang.NullPointerException
at com.tz.TestException.show(TestException.java:26)
at com.tz.TestException.main(TestException.java:16)
原来Java中catch是按顺序往下匹配的,而一旦catch到异常符合要求,就会直接跳出去,有finally就会执行它,没有则直接跳出去,不再执行任何东西,所以catch异常时应该有个顺序的。
catch代码块应该是 从小范围的到大范围的异常 顺序往下写的。
public static int[] nu = null; public static void show() throws NullPointerException { try { System.out.println(nu[3]); }catch (Exception e) { System.out.println(""); e.printStackTrace(); } }
下面这段代码
Exception -
java.lang.NullPointerException
at com.tz.TestException.show(TestException.java:26)
at com.tz.TestException.main(TestException.java:16)
public static int[] nu = null; public static void show() { System.out.println(nu[3]); try { }catch (Exception e) { System.out.println("Exception -"); e.printStackTrace(); } }
下面这段代码
Exception in thread "main" java.lang.NullPointerException
at com.tz.TestException.show(TestException.java:23)
at com.tz.TestException.main(TestException.java:16)
所以try......catch的是它自己囊括的代码出现的异常,方法上throws异常时方法里面的异常;
try catch里面的异常 由它抛出,不在catcha里面代码出现的异常 由方法上的throws Exception抛出;多个catch异常之间,如果存在父子关系,是先写子异常在上面,父级异常在下面,这种编译才不会出错;
Java异常结构图如下:
由上面可以看出 Throwable分两种 一种是异常 一种是错误(这种情况程序基本就跪了 恢复不了)
Java异常又分为两种 checked异常(编译时异常)和Runtime异常 (运行时异常)
异常处理规则:
try 捕获异常 --> catch 处理异常 或者自定义异常逻辑处理代码 --> finally 结束时操作的事
怎么抛出异常?
1. try....catch
2. 方法上 throws 异常
3. 代码块里面 throw new XXXException
4. 代码块里面 throw new XXXException 框架统一处理捕获到的异常信息
处理抛出方式:
(1) 如果你很明确的知道怎么处理异常或者可能会出现什么异常 , 应该用try....catch 的方式抛出异常并写下处理异常代码
(2) 如果不知道有什么异常, 那就在方法上抛出异常,多个异常逗号隔离开就好了
注意: Java 在对(RunTimeException)运行时异常 就算你自己不捕获抛出处理 它也会帮你抛出来 其实.....现在Java7开始项目大多数是把异常抛出来最顶部 也就是控制层C再处理的