Java实训学习笔记07---自定义异常

  • 例子
  • 自定义一个异常---新建MyException类
  • 自定义异常类的使用---修改Test.java
  • 执行结果
  • 使用自定义异常重构项目
  • 新建exception包和SubjectExcpetion类
  • 所有的异常处理---全部在service进行处理
  • 修改SubjectSerivice.java
  • 修改UserSerivice.java


在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。

自定义异常类只需从Exception类或者它的子类派生一个子类即可。自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

自定义异常的步骤:

(1)继承 Exception 或 RuntimeException

(2)提供一个有参构造方法—赋值异常信息

(3)重写getMessage方法

使用异常机制的建议:

1.要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。

2.处理异常不可以代替简单测试—只在异常情况下使用异常机制。

3.不要进行小力度的异常处理—应该将整个任务包装在一个try语句块中。

4.异常往往在高层处理(先了解!后面做项目会说!) 。

例子

自定义一个异常—新建MyException类

package com.chengxian.test;

/**
 * 自定义异常
 * @author 74670
 *
 */
public class MyException extends Exception{
	private String msg;
	
	public MyException(String msg){
		this.msg=msg;
	}
	
	@Override
	public String getMessage(){
		return msg;
	}
}

自定义异常类的使用—修改Test.java

如果自定义异常是为了提示,一定要用try…catch,不要直接用throw往外抛。这样只能被框架捕获。

package com.chengxian.test;

public class Test {

	/**
	 * @param args
	 * @throws ClassNotFoundException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public static void main(String[] args){

		try{
			newIn();
		}catch(MyException e){
			System.out.println(e.getMessage());
		}
	}
	
	public static void newIn() throws MyException{
		
		//常规实例化对象
		Person person =new Person();
		System.out.println("person="+person);
		
		//反射
		String className="com.chengxian.test.Person123";
		Class clazz=null;
		try{
			clazz=Class.forName(className);
		}catch(ClassNotFoundException e){
			throw new MyException("找不到对应的类");
		}
	}
}

java 跑出自定义异常 java实现自定义异常_java 跑出自定义异常


仅仅为了提示,又不想自定义一个Exception,可以用RuntimeException。这个可以抛出异常,并准确定位,缺点是不能处理这个异常,自定义异常的话可以捕获并且处理。

执行结果

java 跑出自定义异常 java实现自定义异常_自定义异常_02

使用自定义异常重构项目

新建exception包和SubjectExcpetion类

java 跑出自定义异常 java实现自定义异常_java 跑出自定义异常_03

package com.chengxian.subject05.exception;

/**
 * 自定义异常
 * @author 74670
 *
 */
public class SubjectException extends Exception{
	private String msg;//异常信息
	
	public SubjectException(String msg){
		this.msg=msg;
	}
	
	public String getMessage(){
		return msg;
	}
}

所有的异常处理—全部在service进行处理

修改SubjectSerivice.java

package com.chengxian.subject05.service;

import java.sql.SQLException;
import java.util.List;

import com.chengxian.subject05.dao.SubjectDao;
import com.chengxian.subject05.exception.SubjectException;
import com.chengxian.subject05.factory.ObjectFactory;
import com.chengxian.subject05.pojo.Subject;

/**
 * 业务层
 * @author Administrator
 *
 */
public class SubjectService {
	//private SubjectDao subjectDao = new SubjectDao();
	private SubjectDao subjectDao=(SubjectDao)ObjectFactory.getObject("subjectDao");

	/**
	 * 添加毕设信息
	 * @param subject
	 * @return
	 * @throws SubjectException
	 */
	public boolean addSubject(Subject subject) throws SubjectException{
		boolean flag=false;
		try {
			flag= subjectDao.addSubject(subject);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SubjectException("数据库异常");
		}
		return flag;
	}
	
	/**
	 * 查询所有毕设信息
	 * @return
	 * @throws SubjectException 
	 */
	public List<Subject> querySubjects() throws SubjectException{
		List<Subject> subjectList=null;
		try {
			subjectList= subjectDao.queryAllSubject();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SubjectException("数据库异常");
		}
		return subjectList;
	}
	
	/**
	 * 根据编号id修改毕设题目信息
	 * @return
	 * @throws SubjectException 
	 */
	public boolean updateTitleById(String title, int id) throws SubjectException{
		boolean flag=false;
		try {
			flag= subjectDao.updateTitleById(title, id);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");			
		}
		return flag;
	}
	
	/**
	 * 根据编号id删除对应的毕设信息
	 * @param id
	 * @return
	 * @throws SubjectException 
	 */
	public boolean delSubjectById(int id) throws SubjectException{
		boolean flag=false;
		try {
			flag= subjectDao.delSubject(id);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");						
		}
		return flag;
	}
	
	/**
	 * 未被选择的条数
	 * @return
	 * @throws SubjectException 
	 */
	public int unSelectedNumber() throws SubjectException{
		int count=0;
		try {
			count= subjectDao.unSelectedNumber();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");						
		}
		return count;
	}
	
	/**
	 * 判断该学生是否已经选择过毕设题目
	 * @param stuNo
	 * @param stuName
	 * @return
	 * @throws SubjectException
	 */
	public boolean isSelected(String stuNo, String stuName) throws SubjectException{
		boolean flag=false;
		try {
			flag= subjectDao.isSelected(stuNo, stuName);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");						
		}
		return flag;
	}
	
	/**
	 * 判断随机编号是否可用
	 * @param number
	 * @return
	 * @throws SubjectException 
	 */
	public boolean isUser(int number) throws SubjectException{
		boolean flag = false;
		List dataList;
		try {
			dataList = subjectDao.isUser(number);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");									
		}
		if(null != dataList && dataList.size()>0){
			Subject subject = (Subject) dataList.get(0);
			flag = subject.getState().equals("0");
		}	
		return flag;
	}
}

java 跑出自定义异常 java实现自定义异常_java 跑出自定义异常_04


每个都要修改,一个对应一个。

修改UserSerivice.java

package com.chengxian.subject05.service;

import java.sql.SQLException;

import com.chengxian.subject05.dao.UserDao;
import com.chengxian.subject05.exception.SubjectException;
import com.chengxian.subject05.factory.ObjectFactory;

public class UserService {
	//private UserDao userDao = new UserDao();
	private UserDao userDao=(UserDao)ObjectFactory.getObject("userDao");
	/**
	 * 登录
	 * @param stuNo
	 * @param pwd
	 * @return
	 * @throws SubjectException
	 */
	public boolean login(String stuNo, String pwd) throws SubjectException{
		boolean flag=false;
		try {
			flag= userDao.queryByUnameAndPwd(stuNo, pwd);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SubjectException("数据库异常");
		}
		return flag;
	}
}