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
原创粉丝点击