J2SE之手动抛出自定义异常

1.手动抛出异常

手动抛出异常要用到throw、throws语句。

throw语句:

用于显式地引发异常,执行流程将在throw语句后立即停止,因此不会执行下一个语句。

抛出异常后,系统会检查最近层的try块,看他是否有一个catch子句与Throwabel实例的类型相匹配。

如果找到匹配,控制权则转到该语句。如果未找到匹配则检查下一层try语句,此循环将继续直到执行完最外层的异常处理程序。

throws语句:

用于处理一个方法可能引发的多个异常,throws必须提供异常列表及方法定义。

假设x()方法调用另一个方法y(),如果方法y()引发异常且该异常未得到处理,则调用法方法x()时必须遵从以下规则:

<1>声明x()方法,同时拥有try/catch语句块来捕获已抛出的异常

<2>如果x()方法没有try/catch块,则异常将传递给它自己的调用者,即调用x()方法的方法。要避免这种情况最好在x()方法中包含至少一个try/catch块

2.手动抛出自定义异常

Exception和Error类提供的内置异常不一定总能捕获程序中发生的所有错误。有时则需要创建用户自定义异常,这些异常都是Exception类的子类。

Exception类未定义自己的任何方法,但从Throwable类继承了其所有的方法。创建的任何用户自定义异常类都将具有该类的方法。

示例代码:

Java代码 复制代码 收藏代码
  1. package mypackage; 
  2. import java.util.Scanner; 
  3. /**
  4. * 手动抛出自定义异常示例
  5. * @author 眼镜哥哥
  6. */ 
  7. public class ExceptionDemo { 
  8.     public ExceptionDemo(){} 
  9.     public static void main(String[] args) { 
  10.         new ExceptionDemo().demo(); 
  11.     } 
  12.     public void demo(){ 
  13.         Scanner s = new Scanner(System.in); 
  14.         System.out.print("请输入数组的长度:"); 
  15.         String str = s.next(); 
  16.         ExceptionClass ec = new ExceptionClass(str); 
  17.         s.close(); 
  18.     } 
  19. class ExceptionClass{ 
  20.     protected ExceptionClass(String size){ 
  21.         try { 
  22.             this.checkSize(size); 
  23.         } catch (IllegalNumberException e) { 
  24.             System.out.println(e); 
  25.             new ExceptionDemo().demo(); 
  26.         } catch (ArraySizeException e){ 
  27.             System.out.println(e); 
  28.             new ExceptionDemo().demo(); 
  29.         } 
  30.     } 
  31.     public void checkSize(String size) throws IllegalNumberException,ArraySizeException { 
  32.         if(size.matches("\\D")){ 
  33.             throw new IllegalNumberException(); 
  34.         } 
  35.         int num = Integer.parseInt(size); 
  36.         if(num<0){ 
  37.             throw new ArraySizeException(); 
  38.         } 
  39.         int[] array = new int[num]; 
  40.         for (int i = 0; i < num; i++) { 
  41.             array[i] = i+1; 
  42.             System.out.println(array[i]); 
  43.         } 
  44.     } 
  45. class IllegalNumberException extends NumberFormatException{ 
  46.     private static final long serialVersionUID = 1L; 
  47.     public IllegalNumberException() { 
  48.         super("输入的不是数字!"); 
  49.     } 
  50. class ArraySizeException extends NegativeArraySizeException{ 
  51.     private static final long serialVersionUID = 1L; 
  52.     public ArraySizeException() { 
  53.         super("传递了非法的数组长度!"); 
  54.     } 
package mypackage;import java.util.Scanner;/** * 手动抛出自定义异常示例 * @author 眼镜哥哥 */public class ExceptionDemo {		public ExceptionDemo(){}	public static void main(String[] args) {		new ExceptionDemo().demo();	}	public void demo(){		Scanner s = new Scanner(System.in);		System.out.print("请输入数组的长度:");		String str = s.next();		ExceptionClass ec = new ExceptionClass(str);		s.close();	}}class ExceptionClass{		protected ExceptionClass(String size){		try {			this.checkSize(size);		} catch (IllegalNumberException e) {			System.out.println(e);			new ExceptionDemo().demo();		} catch (ArraySizeException e){			System.out.println(e);			new ExceptionDemo().demo();		}	}		public void checkSize(String size) throws IllegalNumberException,ArraySizeException {		if(size.matches("\\D")){			throw new IllegalNumberException();		}		int num = Integer.parseInt(size);		if(num<0){			throw new ArraySizeException();		}		int[] array = new int[num];		for (int i = 0; i < num; i++) {			array[i] = i+1;			System.out.println(array[i]);		}	}}class IllegalNumberException extends NumberFormatException{		private static final long serialVersionUID = 1L;	public IllegalNumberException() {		super("输入的不是数字!");	}}class ArraySizeException extends NegativeArraySizeException{		private static final long serialVersionUID = 1L;	public ArraySizeException() {		super("传递了非法的数组长度!");	}}

演示结果图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值