手动抛出异常对象

程序在正常执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,一旦抛出该对象以后,其后的代码就不再执行。

异常对象的产生方式:
1)系统自动生成的异常对象
2)手动生成异常对象并进行抛出(throw)(注意不是throws,throws是用来处理异常的)

注意: 手动抛异常可以抛Exception及其子类,但一般是抛Exception,RuntimeException或者自定义异常,如果new 其他的异常违背了其他异常的意思

手动抛出异常(要用到throw关键字)的例子:

package test02;

public class StudentTest {
	private int id;
	
	public void setId(int id) {
		if(id>0) {
			this.id=id;
		}else {
			System.out.println("输入数据非法");
		}
	}
	
	@Override
	public String toString() {
		return "StudentTest [id=" + id + "]";
	}

	public static void main(String[] args) {
		StudentTest st=new StudentTest();
		st.setId(-1);
		System.out.println(st);//输入数据非法
							   //StudentTest [id=0]		
	}
}

比如如果输入数据非法,我们想报错而不是像上面那样仍然输出相应的结果,就可以手动抛出异常对象。

package test02;

public class StudentTest {
	private int id;
	
	public void setId(int id) {
		if(id>0) {
			this.id=id;
		}else {
			//System.out.println("输入数据非法");
			//手动抛出异常
			throw new RuntimeException("输入数据非法");
		}
	}
	
	@Override
	public String toString() {
		return "StudentTest [id=" + id + "]";
	}

	public static void main(String[] args) {
		StudentTest st=new StudentTest();
		st.setId(-1);//因为抛出的是运行时异常,所以这里不会报错
		System.out.println(st);
	}

}

RuntimeException有一个构造器是带有形参String message的,注意异常处理中有一个方法叫做 getMessage(),这里就相当于通过构造器对类中的message属性做了赋值。

上面的程序控制台会报异常
如果想要对异常直接进行处理,可以throw Exception

package test02;

public class StudentTest {
	private int id;
	
	public void setId(int id) throws Exception {//注意声明此方法可能会抛出异常
		if(id>0) {
			this.id=id;
		}else {
			//System.out.println("输入数据非法");
			//手动抛出异常
			throw new Exception("输入数据非法");
		}
	}
	
	@Override
	public String toString() {
		return "StudentTest [id=" + id + "]";
	}

	public static void main(String[] args) {
		StudentTest st=new StudentTest();
		try {
			st.setId(-1);
			System.out.println(st);//如果setId()出异常,这条语句不会被执行
		} catch (Exception e) {
			System.out.println(e.getMessage());//输入数据非法
			//注意此时程序就不会输出异常的行数之类的信息了,因为没有用e.printStackTrace();
		}
	}

}

你可能感兴趣的:(JavaSE学习记录)