1.简介
如果某个方法不能按照正常的途径完成任务,在这种情况下会抛出一个封装了错误信息的对象,此时这个方法会立刻退出同时不返回任何值,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器
自定义异常的话是继承一个异常类,通常是RumtimeException或者Exception
异常使用的原则
不要将异常处理用于正常的控制流
优先使用标准的异常,建议抛出更加具体的异常
异常信息一定要有意义,每个方法抛出的异常都要有文档,使用日志打印异常之后就不要再抛出异常了
不要在catch中忽略掉捕获到的异常
Java语言如何进行异常处理
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。try用来指定—块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行
try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM
Throwable类常用方法
String getMessage():返回异常发生时的简要描述
String toString():返回异常发生时的详细信息
String getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage返回的结果相同
void printStackTrace():在控制台上打印Throwable对象封装的异常信息
finlly不会执行的情况
在finally语句块第一行发生了异常。因为在其他行finally块还是会得到执行
在前面的代码中用了System.exit(int)已退出程序。exit是带参函数,若该语句在异常语句之后,finally会执行
程序所在的线程死亡
关闭cpu
try里有一个return语句,那么紧跟在这个try后的finally里的代码会不会被执行,什么时候被执行,在return前还是后
会在方法返回调用者前执行
如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值
在finally中直接返回值也是不好的,因为这样会直接在finally中就把结果返回了,因此C#中直接用编译错误的方式来阻止程序员干上面两种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误
2.异常分类
受检查异常编译器在编译期间检查,对于这种异常,方法强制处理或者通过throws子句声明,不处理的话无法通过编译器的检查
非受检查异常是RuntimeException的子类,在编译阶段不受编译器的检查
受检异常
没有匹配方法的异常,没有匹配属性的异常,类找不到异常,方法找不到异常
运行时异常(非受检异常):
3.异常的处理方式
3.1.throw,throws抛出异常
位置不同:throws用在函数上,后面跟的是异常类,可以跟多个,而throw用在函数内,后面跟具体异常
功能不同:throws用来声明异常,让调用者只知道该方法可能出现的问题,可以给出预先的处理方式,throw抛出具体的问题对象,执行到throw方法就已经结束了,并将具体的问题对象抛给调用者
两者都是消极处理异常的方式,只是抛出或者可能抛出异常,真正的处理异常由函数的上层调用处理
3.2.try catch finally捕获异常
Try块必须存在,catch和finally可以不存在,但不能同时不存在
3.3.try with resources
面对必须要关闭的资源,我们应该优先使用try-with-resources而不是try-finally,因此这样的代码更简短清晰
到了java1.7后try-with-resources可以写成下面的形式
标签:语句,java,抛出,基础,方法,try,finally,异常 From: https://www.cnblogs.com/zz-coding/p/17300327.html