您的位置:首页 > 职场人生

java程序员从笨鸟到菜鸟之(三十三)异常之再谈

2017-11-23 11:06 295 查看
本章节包括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{
@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用方法调用栈来跟踪每个线程中一系列方法调用过程,每个线程都有一个独立的方法调用栈。对于
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  throw 异常与继承
相关文章推荐