异常

  • 异常的定义及结构
  1. 定义:

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。Java提供了异常处理机制,异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

  1. 结构
  1. 系统自带的异常类:

  1. 用户自定义异常

如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。

按照国际惯例,自定义的异常应该总是包含如下的构造函数:

一个无参构造函数

一个带有String参数的构造函数,并传递给父类的构造函数。

一个带有String参数和Throwable参数,并都传递给父类构造函数

一个带有Throwable 参数的构造函数,并传递给父类的构造函数。

 

  • 分类
  1. error---错误

是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

  1. Exception --- 异常

异常可分为运行时异常跟编译异常

运行时异常:即RuntimeException及其子类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RuntimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。

编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

 

另一种分类方法:

可查异常:编译异常,编译器要求必须处理的异常,除了runtimeException及其子类,其他的都是可查异常,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查异常:运行时异常和错误,程序中应当尽可能去处理。

 

  • 处理,一般是处理编译性异常

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

  1. Throw与throws

throws表示一个方法声明可能抛出一个检查性异常,当一个函数本身不能处理这个异常的时候,就会抛给上一层,一直到main函数,如果main函数也不能处理,就会由虚拟机处理,处理的方式也很简单,就是打印一下异常的信息。如果一个异常在程序中没有得到处理,程序所在的线程就会被终止,如果应用是单线程的,那么应用就会终止运行(异常链)。

throw表示此处抛出一个已定义的异常(可以是自定义需继承Exception,也可以是java自己给出的异常类)。

Throws后的异常必须是throw的父类或同类。如果一个父类抛出了一个异常,子类必须也抛出该异常或该异常的子类

 

  1. Try-catch

Try中的代码块为监控区域,一旦在try中检测到异常,try中后部分的代码不会被执行,而会执行catch中的代码,一个这个结构中可以由多个catch,一般子类的异常应该放在前面的catch中,不然会被父类覆盖,那么写在后面的子类异常就没什么意义。

 

  1. Try-catch-finally

如果结构中有finally部分,那么不管有没有抛出异常,finally部分都会被执行,然后再执行此结构后面的代码。

需要注意的是,即使try与catch中有return的语句,finally也会被执行,也就是finally总是在return之前执行,如果finally中有return的语句,则返回的是finally中的return,之前的return不会被执行。

一般不要在finally中写return语句,因为会覆盖之前的return语句以及catch中的抛出异常语句。

正确的用法是在try中打开资源,在finally中关闭资源

除了下列情况,总将执行 finally 做为结束:

JVM 过早终止(调用 System.exit(int));

在 finally 块中抛出一个未处理的异常;

计算机断电、失火、或遭遇病毒攻击。

 

  1. throwable的主要方法:

getMessge()

getCause()

printStackTrace()

 

  • 注意的问题

能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理(异常转译)。因为对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。 
  对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,将优雅的异常信息反馈给用户。 

在catch里处理异常的时候不要简单的e.printStackTrace(),而是应该进行详细的处理。比如进行console打印详情或者进行日志记录。

不要在fianlly中使用return。

不要在finally中抛出异常。

减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。

将尽量将所有的return写在函数的最后面,而不是try … catch … finally中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值