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

本章节包括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用方法调用栈来跟踪每个线程中一系列方法调用过程,每个线程都有一个独立的方法调用栈。对于

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值