java程序员从笨鸟到菜鸟之(三十三)异常之再谈
来源:互联网 发布:美术教学网络系统 编辑:程序博客网 时间:2024/05/22 01:03
本章节包括throw和自定义类以及继承与异常的联系,异常处理机制原理
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{@Overridepublic void show() throws Exception{//父类有异常,子类抛出的异常不能比父类的大(可以同级)System.out.println("0");System.out.println(100/0);}@Overridepublic 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用方法调用栈来跟踪每个线程中一系列方法调用过程,每个线程都有一个独立的方法调用栈。对于
阅读全文
1 0
- java程序员从笨鸟到菜鸟之(三十三)异常之浅谈
- java程序员从笨鸟到菜鸟之(三十三)异常之再谈
- Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式
- Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- java程序员从笨鸟到菜鸟之(四十二)线程再涉
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- Java程序员从笨鸟到菜鸟之(序言)+全部链接
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- Java程序员从笨鸟到菜鸟之(序言)+全部链接
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- python 简介
- intellij idea 13&14 插件推荐及快速上手建议
- @Override is not allowed when implementing interface method
- ASP.NET Web Forms
- [转]【OpenCV入门教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
- java程序员从笨鸟到菜鸟之(三十三)异常之再谈
- Kubernetes(K8S)集群管理Docker容器(概念篇)
- 【Scikit-Learn 中文文档】随机梯度下降
- ASP.NET Web Forms
- Spring Cloud构建微服务架构分布式配置中心
- centos7 关闭防火墙
- 总结一下大页的操作
- 禁止表单记住密码自动填充
- 浅析人脸检测之Haar分类器方法