Java——异常的处理方式(try...catch,throws,throw)自定义异常

java.lang.Throwable

异常的公共父类是Throwable,根父类是Object
异常的公共父类java.lang.Throwable
(1)只有当对象是此类(或其子类之一)的实例时,才能通过java虚拟机或者java throw语句抛出
(2)只有此类或其子类之一才可以是catch子句中的参数类型
Throwable类的子类:
(1)Error:错误
一般指严重错误,一般合理的应用程序不应该试图去捕获它。
经典错误:VirtualMachineError(堆内存溢出OutOfMemoryError,栈内存溢出StackOverflowError…)
(2)Exception:异常(运行时异常和编译时异常)
一般异常,合理的应用程序应该试图去捕获它
运行时异常(RuntimeException或它的子类):
编译时,编译器不会提醒处理,只有运行期间,才会发生
编译时异常(除RuntimeExcption系列以外):
编译时,编译器会强制要求程序员编写处理的代码

异常的处理方式

方式一:在方法中直接用try…catch处理
一个try后至少跟一个catch或finally;catch可多个,finally只能有1个

  1. 语法格式
    try{
    可能发生异常的代码
    }catch(异常类型 异常对象名){
    处理这个异常的代码
    }catch(异常类型 异常对象名){
    处理这个异常的代码
    }


    try{
    可能发生异常的代码
    }catch(异常类型 异常对象名){
    处理这个异常的代码
    }catch(异常类型 异常对象名){
    处理这个异常的代码
    }

    finally{
    }
    (1)如果try中的代码没有异常,那么try中的代码正常运行,catch部分不执行,finally中会执行
    (2)如果try中的代码有异常,那么try中发生异常的代码后面的代码就不执行了,对应匹配的catch分支执行,finally也会执行
    (3)不管try是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return,finally中的代码都必须执行
    (4)如果finally中有return,就从finally中的return返回回去
    (5)如果finally中没有return,那么先把try或catch中该执行的先执行完(包括把返回值的结果放到带回调用处的位置),在return结束之前先走一下finally,然后回去结束当前方法
    (6)产生异常后,catch中要是能捕获该异常对象才能被执行,当第一个catch就捕获到了,后面的catch就算能捕获也不能执行
    方式二:在当前方法中不处理,抛给调用者处理
    throws的语法格式

    【修饰符】 返回值类型 方法名(【形参列表】) throws 异常列表们{
    }
    

说明:throws后面可以跟多个异常,顺序无所谓,每一个异常之间使用,分割
throws的好处:
(1)告知被调用者,方法可能会抛出哪些异常,使得调用者可以明确知道应该catch什么异常,如果没有throws,那么调用者不清楚
(2)编译时异常,如果在当前方法中不用try…catch处理,编译不通过,那么可以通过throws明确的说明,抛给调用者处理

关于方法重写时,对throws抛出的异常要求:
子类重写的方法抛出的异常类型必须<=父类被重写的方法抛出的异常类型
重写的要求:
(1)方法名相同
(2)方法的参数(个数,类型,排列顺序)相同
(3)返回值类型
基本数据类型和void:相同
引用数据类型:要求子类重写的方法的返回值类型<=父类被重写的方法的返回值类型
(4)修饰符
权限修饰符:子类重写的方法的权限修饰符的可见性范围>=父类被重写的方法的权限修饰符的可见性范围
(5)抛出的异常类型
子类…<=父类…
哪些方法不能被重写?
final,static,private修饰的方法以及跨包情况下,修饰符缺省的也不能重写
throw语法格式

	throw 异常对象;

(1)在某个方法中,用throw语句手动抛出异常对象,那么如果异常对象是运行时异常,那方法不用加throws,如果是编译时异常,方法还要加try…catch/throws
(2)throw可用于抛出“系统预定义异常”或“用户自定义异常”,还可代替return语句带回异常信息

自定义异常

要求:
(1)必须继承Throwable或它的子类,一般继承RuntimeException和Exception
(2)建议保留父类的两种构造器的形式:无参构造和带给父类的message属性赋值的构造器
(3)使用自定义异常时只能使用throw语句手动抛出,不能JVM自动抛出
(4)建议增加serialVersionUID

	class MyException extends Exception{
		private static final long serialVersionUID=1L;
		public MyException(){
			super();
		}
		public MyException(String message){
			super(message);
		}
	}

你可能感兴趣的:(java)