java异常

在java中,异常对象都是派生于Throwable类的一个实例,并且当java中的内置异常类不能满足需求时,用户可以创建自己的异常类。

1.Throwable有两个重要的子类:Exception和 Error。
Error描述了java运行时系统内部错误和资源耗尽错误。不由程序进行捕获或处理,当error发生时,程序将会停止。如OutOfMemoryError(当JVM在为对象分配内存空间时,剩余的空间不够,同时也没有可以释放的内容时,会发省这样的错误)。
Exception是程序本身可以处理的异常,分为RuntimeException和非RuntimeException。
2.Unchecked Exception和Checked Exception。
其中Error和RuntimeException及它们的子类为不可查异常(编译器不要求强制处置的异常)。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常(编译器要求必须处置的异常)。
3.java中异常处理方式分为抛出异常和捕获异常。
抛出异常分为隐式声明抛出和显示声明抛出。
由于RuntimeException不可查,系统将自动抛出异常,允许程序方法不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码行给出提示,即隐式抛出。
对于所有可查异常,要么显式抛出异常,要么捕捉异常。

4.自定义异常

public class MyException extends Exception{

	
	/**
	 * 自定义可查异常类
	 */
	private static final long serialVersionUID = 1L;

	public MyException() {
		
	}
	public MyException(String message) {
		super(message);
	}

}
处理异常方式如下:

public class Test {
	/**
	 * 处理两数相除,抛出一个MyException异常,当除数为0时,会创建异常对象,提示信息为"除数不能为0"
	 * @param a 被除数
	 * @param b 除数
	 * @throws MyException 交给上层调用者处理该异常
	 */
	public void divide(int a , int b)throws MyException{
		if(b==0)throw new MyException("除数不能为0");
		else {
			System.out.println(a/b);
		}
	}
	
	/**
	 * 调用divide()方法,并且捕获异常
	 */
	public void compte1(){
		int a = 1;
		int b = 0;
		try {
			divide(a,b);
		} catch (MyException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 调用divide()方法,抛出异常不做处理,交给更上一层处理
	 * @throws MyException
	 */
	public void compte2() throws MyException{
		int a = 1;
		int b = 0;
		divide(a,b);
	}
	
	
	public static void main(String args[]){
		//new Test().compte1();
		
		try {
			new Test().compte2();
		} catch (MyException e) {
			e.printStackTrace();
		}
	}
}

下面是一个小作业,曾经在慕课网上学习java时老师留下的作业



下面贴出代码:

public class Demo {
/**
 * 用户根据名称或者序号查找图书
 */
	//0-语文                  1-数学                       2-英语
	static String books[] = {"语文" , "数学" , "英语"};
	
	static Scanner scan = null;
	/**
	 * 根据命令选择查找图书的方式
	 * @param order 键盘输入的命令
	 * @throws OrderException  抛出命令错误异常
	 * @throws BookException  抛出找不到图书异常
	 */
	public static void orderManager (int order)throws OrderException, BookException{
		if(order!=1 && order!=2){
			throw new OrderException("命令不存在");
		}
		if(order ==1){     //根据名称查找
			System.out.println("输入图书名称");
			scan = new Scanner(System.in);
			String key = scan.nextLine();
			searchByName(key);
		}
		if(order ==2){    //根据序号查找
			System.out.println("输入图书序号");
			scan = new Scanner(System.in);
			int index = scan.nextInt();
			searchById(index);
		}
	}
	
	
	private static void searchById(int index) throws BookException {
		
		if(index<0 || index>books.length-1 ){
			throw new BookException("该序号的图书不存在");
		}else{
			System.out.println(index + books[index]);
		}
	}


	private static void searchByName(String key) throws BookException {
		int i = 0;
		for(i = 0;i<books.length;i++){
			if(key.equals(books[i]))break;
		}
		if(i>=books.length){
			throw new BookException("改名称的图书不存在");
		}else{
			System.out.println(i + books[i]);
		}
	}


	public static void main(String args[]){
		
		while(true){
			System.out.println("输入命令:1-按名称查找    2-按序号查找");
			scan = new Scanner(System.in);
			int order = scan.nextInt();
			try {
				orderManager(order);
			} catch (OrderException e) {
				System.out.println("改命令不存在");
				continue;
			} catch (BookException e){
				System.out.println("该图书不存在");
				continue;
			}
		}
		
	}
		
}
public class OrderException extends Exception{
	/**
	 * 命令错误异常
	 */
	private static final long serialVersionUID = 1L;

	public OrderException(){}
	
	public OrderException(String message){
		super(message);
	}
}
public class BookException extends Exception{
	/**
	 * 找不到图书异常
	 */
	private static final long serialVersionUID = 1L;
	public BookException(){}
	public BookException(String message){
		super(message);
	} 
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值