本文共 4172 字,大约阅读时间需要 13 分钟。
【JavaSE】day12_异常(Exception)
1)异常捕获机制中的try-catch
* try中包含的是可能出错的代码片段。
* catch用来捕获try中出现的错误,并处理
2)catch可以写很多个,针对不同的异常,若有不同的处理手段,可以分别捕获。但是应当有一个好的习惯,就是在最后一个捕获中来捕获Exception,这样至少可以保证程序不会因为一个未捕获的异常而导致中断。
当catch的异常中存在父子类继承关系时,要保证子类异常在上,父类异常在下。
细节见代码:
package day03;/** * 异常捕获机制中的try-catch * try中包含的是可能出错的代码片段。 * catch用来捕获try中出现的错误,并处理。 * */public class ExceptionDemo1 { public static void main(String[] args) { System.out.println("start"); try{ String str = "a"; System.out.println(str.length()); System.out.println(str.charAt(0)); System.out.println(Integer.parseInt(str)); //try中出错的代码之下的语句都不会执行 System.out.println("hello"); }catch(NullPointerException e){ System.out.println("空指针异常"); }catch(StringIndexOutOfBoundsException e){ System.out.println("下标越界"); /* * catch可以写很多个,针对不同的异常,若有不同的处理 * 手段,可以分别捕获。但是应当有一个好的习惯,就是在 * 最后一个捕获中来捕获Exception,这样至少可以保证程序 * 不会因为一个未捕获的异常而导致中断。 * * 当catch的异常中存在父子类继承关系时,要保证子类异常 * 在上,父类异常在下。 */ }catch(Exception e){ System.out.println("未知异常!"); } System.out.println("end!"); }}
1)finally块必须定义在异常捕获机制的最后。
* 可以定义在try之后(try-finally),也可以定义在最后一个catch之后(try-catch-finally)。
* finally可以保证其内部的代码无论try中的语句是否出现异常都会执行。
* 通常像释放资源这类代码就应当放在finally中,比如说关闭流。
代码演示:
package day03;/** * finally块 * finally块必须定义在异常捕获机制的最后。 * 可以定义在try之后(try-finally),也可以定义在 * 最后一个catch之后(try-catch-finally)。 * finally可以保证其内部的代码无论try中的语句是否 * 出现异常都会执行。 * 通常像释放资源这类代码就应当放在finally中,比如说 * 关闭流。 * */public class ExceptionDemo2 { public static void main(String[] args) { try{ String str = null; System.out.println(str.length()); }catch(Exception e){ System.out.println("出错了!"); }finally{ System.out.println("finally语句块"); } }}
1)通常两种情况会使用throw抛出一个异常:
* 1.程序中遇到了一个满足语法要求,但是不满足业务逻辑要求的情况时,可以自行创建一个异常的实例并抛出给调用者。
* 2.程序执行过程中确实出现了一个异常,但是不应当在当前方法中解决时,可以将其抛出给调用者。
2) 当一个方法上使用throws声明抛出某些异常时,我们在调用该方法时要求必须处理这些异常。 处理手段有两种:
* 1:自行try-catch捕获并处理。
* 2:在当前方法上继续使用throws声明将这些异常抛出。
代码演示:
package day04;/** * 用来测试throw与throws的用法 * * 通常两种情况会使用throw抛出一个异常: * 1.程序中遇到了一个满足语法要求,但是不满足业务逻辑 * 要求的情况时,可以自行创建一个异常的实例并抛出给 * 调用者。 * 2.程序执行过程中确实出现了一个异常,但是不应当在当 * 前方法中解决时,可以将其抛出给调用者。 */public class Person { private int age; public int getAge() { return age; } /* * 当给定的实参值不满足这里的取值要求时(不满足描述人类 * 信息的业务逻辑)可以抛出一个异常通知调用者。 */ public void setAge(int age) throws IllegalAgeException { if(age<=0||age>100){ throw new IllegalAgeException("不符合人类年龄"); } this.age = age; } }
package day04;/** * 测试异常的抛出 * */public class PersonTest { public static void main(String[] args) { Person p = new Person(); try { /* * 当一个方法上使用throws声明抛出某些异常时,我们 * 在调用该方法时要求必须处理这些异常。 * 处理手段有两种: * 1:自行try-catch捕获并处理。 * 2:在当前方法上继续使用throws声明将这些异常抛出。 */ p.setAge(1000); } catch (IllegalAgeException e) { System.out.println(e.getMessage()); //获取信息 e.printStackTrace(); } System.out.println(p.getAge()); }}
package day04;import java.awt.AWTException;import java.io.IOException;/** * 测试子类重写父类含有throws抛出异常的方法时的注意事项: * */public class Father { public void dosome() throws IOException,AWTException{ }}class Son extends Father{ //重写的三个可以两个不可以 /** * 重写时允许不再抛出任何异常。 */// public void dosome(){// // } /** * 重写时也可以仅抛出父类方法抛出的部分异常。 */// public void dosome() throws AWTException{// // } /** * 重写时允许抛出父类型方法中抛出的异常的子类异常。 */// public void dosome() throws FileNotFoundException{// // } /** * 重写时,不允许抛出额外异常 * 即:父类没有的,也不是父类抛出异常的子类型异常。 */// public void dosome() throws SQLException{ //编译错误// // } /** * 重写时,不允许抛出父类抛出异常的父类型异常。 */// public void dosome()throws Exception{ //编译错误// // } }
package day04;/** * 自定义异常,通常用来描述某个业务逻辑级别的错误。 * 年龄不合法。 */public class IllegalAgeException extends Exception { private static final long serialVersionUID = 1L; public IllegalAgeException() { super(); // TODO Auto-generated constructor stub } public IllegalAgeException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public IllegalAgeException(String message) { super(message); // TODO Auto-generated constructor stub } public IllegalAgeException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } }
转载地址:http://erews.baihongyu.com/