异常
什么是异常机制?
异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的程序不能按照预期执行时。程序处理问题的一种方式。
为什么使用异常。
public class Son {
//根据父亲和母亲的身高计算儿子的身高。
public double getSonHeight(double f,double m){
if(f<=0){
//停止执行下面的代码 并提醒调用者错误信息。
// System.out.println("父亲身高输入有误");
throw new RuntimeException("父亲身高输入有误");
}
double height=(f+m)/2+5;
return height;
}
}
在我们实际开发中, 有返回值的函数需要进行返回数据,但是有的时候 参数非法性 导致我们的函数无法正常执行 所以就无法正常return 返回数据。例如 我们现在有一个获取孩子身高的函数,函数的参数为 父亲 和 母亲的身高,参数类型为 doub1e ,但是 我们如果参数传递为 负数,从语法的角度讲没有问题,因为doub1e类型 包含负数,但是一旦传递负数 就不符合我们实际情景了,因为一个人的身高不可能为负数,所以我们在正常代码执行之前需要进行安全判断,如果参数有问题 则 使用异常的形式进行返回。
如何抛出异常---执行方
如何处理异常--->调用方
第一种: 异常转移【继续抛】
当执行方出现异常后,我们调用方可以把异常继续抛给调用该方法处。
语法:
public 返回类型 方法名(参数列表) throws 异常类,异常类型,异常类型{
}
把异常抛给调用方法的位置,所有调用方都继续往上抛异常,最终异常抛给了jvm。 jvm简单粗暴的方式:终止程序,并打印异常信息。
第二种: try处理
语法:
try{
//可能发生异常的代码
}catch(异常类型 e){
//处理异常的代码
}finally{
//有没有异常都会执行该代码。
}
finally
最终执行的代码---{有误异常都会被执行的代码}。一般用于资源的关闭【比如io流,jdbc等】。
关闭资源模拟:
public class Test03 {
public static void main(String[] args) {
fun();
}
public static String fun(){
System.out.println("输入密码打开保险柜");
try {
System.out.println("取钱~~~~~~");
int c = 10 / 0;//异常机制。保险柜没有关闭
return "流程正常";
}catch (RuntimeException e){
System.out.println("处理意外");
}finally {
System.out.println("关闭保险柜"); //无论是否存在异常,都会被执行的代码。 [即使遇到return后finally代码依然会执行]。一般用于资源的关闭。
}
return "流程出现非正常";
}
finally可以单独和try使用。用法不常用。异常没有处理。
try{
}finally{
}
异常的类型
在jdk中提高了大量的异常类。我们之前就使用了一个RuntimeException异常类。
Error不归程序员管,这种异常是java公司自己研发使用的。
我们主要的还是Exception:它是我么们程序最容易出现的异常。里面分为运行时异常和编译时异常。
运行时异常:当前程序运算的时候才会出现的异常,而且这种异常无需再编译时强制处理。
编译时异常: 程序再编译的时候就要求强制处理该异常。不然程序无法执行。
自定义异常类
JDK已经帮你提供了大量的异常类,如果jdk提供的无法满足你的需求,你可以自己定义异常类。
自定义异常类的目标: 见名知意。 当出现这个异常类型时,我就指定错误的原因。
比如年龄不合法时,抛出了一个RuntimeException异常对象。
步骤:
定义一个类并继承RuntimeException. 定义一个有参构造方法。
public class AgeException extends RuntimeException{
public AgeException(String msg){
super(msg); //调用父类的构造方法
}
}
例子:
自定义异常类:
public class AgeException extends RuntimeException{//继承RuntimeException
public AgeException() {
}
public AgeException(String message) {
super(message);//调用RuntimeException中的方法体。
}
}
使用自定义异常
public class Student{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<6){
throw new AgeException("年龄有误");
}
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}