异常机制(自定义异常)(方法重写与异常)

自定义"无效名字异常".
1.编译时异常,直接Exception
2.运行时异常,直接继承RuntimeException
自定义异常与手动抛出异常

自定义一个异常:字符长度不够

public class IllegalNameException  extends Exception{
	//自定义异常写法大致固定如下,两个构造函数
	//一个有参的一个无参的,将字符串通过super往上传
	public	 IllegalNameException() {
		
	}
	public IllegalNameException(String s) {
		super(s);
	}
}

一个用户服务类,用于注册用户

//顾客相关的业务

//这里将手动抛出的异常往上抛得原因是由于,我们希望注册得人能够知道他的用户名长度不够而产生了异常,希望他去处理,所以网上抛在主函数中去处理
//同时注意, 异常类型是跟在方法后面,使用throws往上抛
public class CustomerService {

		public void register(String name)throws IllegalNameException {
			//完成注册
			if(name.length()<6) {
			//小于6则发生了异常,则需要创建异常对象
				IllegalNameException e =new IllegalNameException("用户名长度不能 少于六位");
				//手动抛出异常
				throw e;
			}
			//如果代码能执行到此处,证明用户名是合法的
			System.out.println("注册成功");
		}

}

一个测试类,在测试类里面主函数类,调用用户类来进行测试

public class Test {
		public static void main(String[] args) {
			String usrname = "jack2-1";
					
						//调注册方法进行注册
			CustomerService cs = new CustomerService();
			try {
			cs.register(usrname);
		}catch(IllegalNameException e)
			{
				String ms = e.getMessage();
				System.out.println(ms);
			}
		}
}

以上测试代码叙述了一个自定义异常的定义,以及手动抛出异常,手动抛出异常是反馈到用户界面去让用户处理
同时这里联系前面博客中得getmessage()方法一栏,知道了getmessage()得到得字符串具体是什么东西
在自定义异常中,异常类的实例化需要自己创建,所以可以清晰的看到在实例化异常的时候给赋予了字符串内容
但是不是自定义的异常中,异常类的实例化是系统默认创建的,所以其中的字符串也是系统默认给出的,
在通过catch抓住异常之后,用getmessage()捕获的字符串内容根本意义上是相同的,一个是自己最开始就赋值了的(自定义类),一个是系统默认赋值(非自定义类)

2.方法重写与异常

重写的方法不能比被重写的方法抛出更宽泛的异常

//以下代码无法执行,因为父类中的方法没有异常,则子类中无法抛出比起宽泛的异常(即无法抛出异常)
class A{
	public void m1(){}
}
class B extends A{
	//重写父类中的方法
	public void m1() throws Exception{
	}
}


//以下代码同样无法执行,还是子类重写方法抛出异常的范围不能比父类更宽,IOException 比FileNotFoundException范围更宽
class A{
public void m1() throws FileNotFoundException(){

}
}
class B{
public void m1() throws IOException(){

}
}

你可能感兴趣的:(java)