浅谈Java中的异常

异常就是Java程序在运行过程中出现的错误。
当出现的问题很严重时,就称其为错误,即Error,我们对其不予处理,因为这种问题一般是很严重的我们无法处理的问题。
当出现的问题不是很严重时,就称其为异常,即Exception。异常又分为了编译时异常和运行时异常。对于编译时异常(非RuntimeException),我们是一定要处理的,否则程序无法运行;对于运行时异常(RuntimeException),我们可处理,可不处理。

下面针对Exception进行详谈。

Exception

对于异常的处理:

  • 当main方法接收到异常时,如果我们没有处理该异常,那么main方法就会把该异常交给调用main的JVM进行异常的处理。JVM有一个默认的处理异常的机制,此机制就会将异常处理掉,同时将异常的名称、异常的信息、异常出现的位置打印在控制台上,并停止运行程序。
  • 当main方法接收到异常时,我们可以自己去处理该异常,同时程序不会停止运行,还会继续运行。

异常处理方式

处理异常有两种方式:

  • 自己写程序处理,使用try…catch…finally语句
  • 将异常交给调用者处理,使用throws
try…catch…finally

try…catch处理异常的基本格式

try	{
	可能出现问题的代码 ;
}catch(异常名 变量名){
	针对问题的处理 ;
}finally{
	释放资源;
}

变形格式:

	try	{
		可能出现问题的代码 ;
	}catch(异常名 变量名){
		针对问题的处理 ;
	}

但需要注意的是:

  • try中的代码越少越好
  • catch中要做出处理,哪怕写一条输出语句也可以,不能将异常信息隐藏起来

还可以使用一下格式进行异常的处理:

try {
 可能出现问题的代码 ;
}catch(异常名1 变量名1){
 对异常的处理方式 ;
}catch (异常名2 变量名2){
  对异常的处理方式 ;
}....

上述方法可以使用try…catch处理多个异常

对于catch里的异常名需要注意的是:

  • 对于我们能够明确的异常类名,我们就尽量明确,不要用大的异常类(比如 该类的父类)名来处理该异常
  • 平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。

finally
特点:被finally控制的语句体一定会执行(前提 jvm没有停止)
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))

finally的作业:用于释放资源,在IO流操作和数据库操作中会见到

final,finally和finalize的区别

  • final:是一个状态修饰符,可以用来修饰类,变量,成员方法。被修饰的类不能被子类继承,,修饰的变量其实是一个常量不能被再次赋值,修饰的方法不能被子类重写。
  • finally:用在try…catch…语句中,作用是释放资源。特点:始终被执行(JVM不能退出)。
  • finalize: 这是Obejct类中的一个方法,用来回收垃圾。

如果catch里面有return语句,finally的代码会执行,且是在return前执行。

throws

除了使用try…catch的方式处理异常外,我们还可以使用throws的方式处理异常。
使用throws处理异常时,我们是将异常抛给了调用者去处理,具体来讲就是 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上进行标识。

throws和throw的区别

throw:在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
区别:

  • throws
    用在方法声明后面,跟的是异常类名
    可以跟多个异常类名,用逗号隔开
    表示抛出异常,由该方法的调用者来处理
    throws表示出现异常的一种可能性,并不一定会发生这些异常
  • throw
    用在方法体内,跟的是异常对象名
    只能抛出一个异常对象名
    这个异常对象可以是编译期异常对象,可以是运行期异常对象
    表示抛出异常,由方法体内的语句处理
    throw则是抛出了异常,执行throw则一定抛出了某种异常
自定义异常

在编写程序时,我们有时候遇到的问题是Java提供的异常类所无法解决的,此时我们就可以自己定义异常类来解决对应的问题。
那么如何写自定义异常类呢?
在编写自定义异常类时,需要将自定义的异常类加入到Java的异常类体系中:

  • 继承自Exception
  • 继承自RuntimeException

在进行异常的处理时,像我们使用Java提供的异常类处理异常的方式一样使用自定义异常类去处理异常。

异常处理注意事项

针对编译期异常,在我们进行异常处理时,需要注意的有:

  • 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类,或者子类不抛出异常也是可以的。
  • 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常,或者子类不抛出异常也是可以的。
  • 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。

在异常处理上,我们应该如何使用异常处理:
使用异常处理的原则是: 如果该功能内部可以将问题处理,用try…catch,如果处理不了,交由调用者处理,这时用throws。
后续程序需要继续运行就try。
后续程序不需要继续运行就throws
如果JDK没有提供对应的异常,就需要自定义异常

发布了44 篇原创文章 · 获赞 7 · 访问量 2449

猜你喜欢

转载自blog.csdn.net/Adelagirl/article/details/103055333