java程序员从笨鸟到菜鸟之(三十三)异常之再谈
2017-11-23 11:06
295 查看
本章节包括throw和自定义类以及继承与异常的联系,异常处理机制原理
1.throw 用于方法块里面的代码(语句层面),比throws的层次要低,比如try...catch ....语句块,表示它抛出异常,但它不会处理它(没有能力处理),通常是由方法块的throws 抛出异常处理类来,由上层处理。
2.throw用在程序中,明确表示这里抛出一个异常,throw抛出的是一个具体的异常类的实例。
3.程序在执行到throw语句时立即停止,它后面的语句都不执行。
实例1
答:在特定的问题领域,可以通过扩展Exception类或RuntimeException类来创建自定义的异常,即:自定义一个类,继承自Exception或者继承自RuntimeException。自定义异常类包含和异常相关的信息,有助于负责捕获异常的catch代码块正确分析并处理异常
实例2 自定义异常类
1)子类在重写父类中的方法的时候,如果父类中方法有抛出异常,那么子类重写的这个方法,抛出异常不能够比父类中该方法异常大,(要么是父类中该方法异常的子类)(最起码应该保存一致)理解上:父亲坏了,儿子不能比父亲更坏
2)子类继承父类,要重写父类中的方法的时候,如果本身父类中该方法没有异常,那么在子类中重写该方法的时候,不能抛出异常,只能捕获异常!
实例3 继承与异常
说明:父类、子类、测试类均在一个源文件里
问题:我们知道子类重写父类的方法时,编译在左,运行在右,那么:父类运行时异常,子类编译时异常,会报错吗?
实例4
点击打开链接:java中异常抛出后代码还会继续执行吗
异常处理机制:
Jvm用方法调用栈来跟踪每个线程中一系列方法调用过程,每个线程都有一个独立的方法调用栈。对于
throw
注意事项1.throw 用于方法块里面的代码(语句层面),比throws的层次要低,比如try...catch ....语句块,表示它抛出异常,但它不会处理它(没有能力处理),通常是由方法块的throws 抛出异常处理类来,由上层处理。
2.throw用在程序中,明确表示这里抛出一个异常,throw抛出的是一个具体的异常类的实例。
3.程序在执行到throw语句时立即停止,它后面的语句都不执行。
实例1
package org.westos_05; /** * @author Orange * @version 1.8 */ public class Demo { public static void main(String[] args) { try{ method(); }catch(Exception s){ System.out.println("我也处理不了"); } } private static void method() throws Exception { int a=100; int b=0; try{ System.out.println(a/b); }catch(Exception e){ throw new Exception("hello"); //放在catch代码块中:仅仅是抛出异常,自己处理不了 } } }说明:throw不一定非得try-catch语句中抛出异常,其它判断地方也可以,但是一旦抛出异常(就必须处理)
自定义异常类
实际开发中不可能一直使用已经提供了的异常类,有时候需要自己定义一个异常类,如何自定义一个异常类?答:在特定的问题领域,可以通过扩展Exception类或RuntimeException类来创建自定义的异常,即:自定义一个类,继承自Exception或者继承自RuntimeException。自定义异常类包含和异常相关的信息,有助于负责捕获异常的catch代码块正确分析并处理异常
实例2 自定义异常类
package org.westos_05; //自定义的一个异常类 public class MyException extends Exception { public MyException(){ } public MyException(String message){ super(message) ;//注意:注释掉此行打印内容对比 /* 有参的构造方法: Exception(String message):构造带指定详细消息()的新异常 */ } }老师类
package org.westos_05; public class Teacher { public void check(int score) throws MyException{ //针对分数进行判断 if(score>100 || score<0){ throw new MyException("分数应该在0和100之间") ; }else{ System.out.println("分数的值属于正确范围..."); } System.out.println("我能执行不?"); } }测试类
package org.westos_05; import java.util.Scanner; public class StudentDemo { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; System.out.println("请您输入一个分数:"); int score = sc.nextInt() ; //创建Teacher对象 Teacher t = new Teacher() ; try { t.check(score) ; } catch (MyException e) { //自定义异常类,继承了Exception类 //等价:MyException e=new MyException("分数应该在0和100之间") //转到Exception---多态的形式 e.printStackTrace(); } } }
继承与异常
重写时,异常的注意事项:1)子类在重写父类中的方法的时候,如果父类中方法有抛出异常,那么子类重写的这个方法,抛出异常不能够比父类中该方法异常大,(要么是父类中该方法异常的子类)(最起码应该保存一致)理解上:父亲坏了,儿子不能比父亲更坏
2)子类继承父类,要重写父类中的方法的时候,如果本身父类中该方法没有异常,那么在子类中重写该方法的时候,不能抛出异常,只能捕获异常!
实例3 继承与异常
package org.westos_06; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionDemo { public static void main(String[] args) { Fu fu=new Zi(); try { fu.show(); } catch (Exception e) { System.out.println("我来处理异常"); } fu.method(); } } class Fu{ //父类中带有抛出异常的方法 public void show() throws Exception{ //父类本身有异常 } public void method(){ //父类本身没异常 } } class Zi extends Fu{ @Override public void show() throws Exception{ //父类有异常,子类抛出的异常不能比父类的大(可以同级) System.out.println("0"); System.out.println(100/0); } @Override public void method(){ String str = "2017-10-19" ; /** * 父类无异常,子类不能抛出异常,只能捕获,处理异常 */ //创建SimpleDateFormat对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ; try { Date d = sdf.parse(str) ; } catch (ParseException e) { e.printStackTrace(); } System.out.println("Hello Kitty"); } }
说明:父类、子类、测试类均在一个源文件里
问题:我们知道子类重写父类的方法时,编译在左,运行在右,那么:父类运行时异常,子类编译时异常,会报错吗?
实例4
package org.westos_06; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * @author Orange * @version 1.8 */ public class Test { public static void main(String[] args) { /** * 重写:编译在左(Fu1),运行在右(Zi1) * 说明:运行时,已经编译过了,所以对于(子类)编译时的异常,还得处理 * 看下列代码是否错误?如果错误,请说明原因?如果正确写出结果 * 意外:两个静态方法的重写 * 报错说明:此静态方法不能隐藏 Fu中的实例方法(后续补充) */ Fu1 fu=new Zi1(); fu.method(); } } class Fu1{ public void method(){ int a=0; int b=100; System.out.println("父类方法执行了没有"); System.out.println(b/a); } } class Zi1 extends Fu1{ public void method(){ String s="2017-11-23"; SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); Date pa; try { pa = sd.parse(s); } catch (ParseException e) { e.printStackTrace(); System.out.println("是否出现异常?"); } System.out.println("子类方法执行了没有?"); } }
点击打开链接:java中异常抛出后代码还会继续执行吗
异常处理机制:
Jvm用方法调用栈来跟踪每个线程中一系列方法调用过程,每个线程都有一个独立的方法调用栈。对于
相关文章推荐
- java程序员从笨鸟到菜鸟之(三十三)异常之浅谈
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(五十五)细谈Hibernate(六)Hibernate继承关系映射
- Java程序员从笨鸟到菜鸟之(三十八)细谈struts2(三)struts2拦截器源码分析
- Java程序员从笨鸟到菜鸟之(三十八)细谈struts2(三)struts2拦截器源码分析
- Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)
- Java程序员从笨鸟到菜鸟之(四十)细谈struts2(四)struts2中action执行流程和源码分析
- Java程序员从笨鸟到菜鸟之(六十八)细谈Spring(二)自己动手模拟spring
- Java程序员从笨鸟到菜鸟全部博客目录
- Java程序员从笨鸟到菜鸟之(四十二)大话设计模式(八)状态模式
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- Java程序员从笨鸟到菜鸟之(九十三)深入java虚拟机(二)——类的生命周期(上)类的加载和连接