异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理
异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable
其下有两个子类:
java.lang.Error::严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
java.lang.Exception :表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要 处理的。好比感冒、阑尾炎。
平常所说的异常指 java.lang.Exception
Error 和 Exception 区别
Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这 类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;
Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。
Exception异常分类
我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。 异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式 化异常)
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报 错)。(如数学异常)
注意:运行时异常,编译时不被检查的异常,不需要用throws 声明抛出 异常对象所属类,也可以不用throw 抛出异常对象或异常引用。对于调用该方法,也不需要放于 try-catch 代码块中。(避免程序代码错误被掩盖在运行中无法察觉)。检查异常,编译时被检测的异常,一旦用throw 抛出异常,如果当前方法可处理异常,那么需要在该方法内通过 try-catch 处理异常。如果当前方法不具备该异常的处理能力,那么必须在参数列表后方法体 前使用 throws 声明异常所属类,交给方法的调用方处理 。
异常的处理
throw和throws
1.throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常 和非受查异常都可以被抛出。
2.throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。
3.一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。
4.throw关键字的作用: 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。throw用在方法内,用来抛出 一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
5.throws关键字的作用: 声明处理异常:使用throws关键字将问题标识出来, 表示当前方法不处理异常,而是提醒给调用者, 让调 用者来处理....最终会到虚拟机,虚拟机直接结束程序,打印异常信息。
throws:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ // 可以抛出一个,也可以多个 }
注意:
1.在子父类继承中,子类重写父类的方法,如果父类的方法没有抛异常,子类的方法也不能抛异常。
如果父类方法也抛异常了,子类重写的方法所抛的异常不可以是父类方法所抛异常的父类
(子类抛出的异常范围不能超过父类)
2,哪里用哪里抛
throw:
throw异常可以直接写在方法体里面,但是如果是检查异常,编译时被检测的异常,一旦用throw 抛出异常,如果当前方法可处理异常,那么需要在该方法内通过 try-catch 处理异常。如果当前方法不具备该异常的处理能力,那么必须在参数列表后方法体 前使用 throws 声明异常所属类,交给方法的调用方处理 。像下面的代码就要通过throws声明
import java.util.Scanner; public class ExcTest { public static void main(String[] args) throws Exception{ // 请在Begin-End间编写代码 /********** Begin **********/ // 第一步:接收给定的年龄 Scanner input = new Scanner(System.in); int age = input.nextInt(); // 第二步:判断用户年龄,小于18或者大于90时,抛出异常 if (age < 18 | age >90){ throw new Exception("18岁以下,90岁以上的住客必须由亲友陪同"); } // 第三步:当年龄介于18到90之间时,输出指定提示语 if (age >= 18 & age <= 90){ System.out.println("欢迎入住本酒店"); } /********** End **********/ } }
try-catch-finally 捕获处理异常
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有 些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
try{ // 可能会出现异常的代码 }catch(异常的类型 变量名){ // 处理异常的代码或者打印异常的信息 }finally{ // 无论异常是否发生,都会执行这里的代码(正常情况,都会执行finally中的代码,一般用来释放资源) }
执行步骤:
1.首先执行try中的代码,如果try中的代码出现了异常,那么就直接执行catch()里面的代码,执行完后会执 行finally中的代码,然后程序继续往下执行
2.如果try中的代码没有出现异常,那么就不会执行catch()里面的代码,但是还是会执行finally中的代码,然后程序继续往下执行
注意:
1. try和catch都不能单独使用,必须连用。
2. try中的代码出现了异常,那么出现异常位置后面的代码就不会再执行了
3. 捕获处理异常,如果程序出现了异常,程序会继续往下执行 声明处理异常,如果程序出现了异常,程序就不会继续往下执行
理解:throw了一个异常之后不是指程序直接停止而是看有没有被catch,cathch之后则会继续执行catch里的方法,结合下列实例
结论:
- 凡是有异常的地方,需要有处理异常的地方。(示例:Demo1, Demo2)
- 只要异常被处理,异常处理之后的代码都可以正常执行。(示例:Demo1, Demo2)
- 异常被往上抛出,则抛出异常之后的代码将不被执行。(示例:Demo2, Demo3)
demo1
demo2:
获取异常信息
Throwable类中定义了一些查看方法:
public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
public String toString() :获取异常的类型和异常描述信息(不用)。
public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台
public class Test { public static void main(String[] args) { /* Throwable获取异常信息的方法: - public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。 - public String toString():获取异常的类型和异常描述信息(不用)。 - public void printStackTrace():打印异常的跟踪栈信息并输出到控制台。 */ System.out.println("开始"); try { System.out.println(1/0);// 报异常,产生一个异常对象 }catch (ArithmeticException e){ /*System.out.println("出现了异常"); System.out.println(e.getMessage()); System.out.println(e); System.out.println(e.toString());*/ e.printStackTrace(); } System.out.println("结束"); } }
异常的注意事项
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果父类的方法抛出了多个异常,子类覆盖(重写)父类方法时,只能抛出相同的异常或者是他的子集。
父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获 处理,不能声明抛出
声明处理多个异常,可以直接声明这多个异常的父类异常 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
多个异常使用捕获又该如何处理呢?
- 多个异常分别处理。
- 多个异常一次捕获,多次处理。
- 多个异常一次捕获一次处理。
当多异常分别处理时,捕获处理,前边的类不能是后边类的父类 一般我们是使用一次捕获多次处理方式,格式如下:
try{ 编写可能会出现异常的代码 }catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }
这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间 有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
异常类如何定义?
- 1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
- 2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。
标签:java,处理,抛出,代码,方法,catch,异常
From: https://www.cnblogs.com/sixsix666/p/17929442.html