异常
异常,简单来说,就是一个程序执行过程中发生的不正常情况的事件。
异常机制
java中提供了两种错误处理机制,系统层面的Error和程序层面的Exception,两种都继承自一个共同的父类Throwable
*Error类型的错误通常是程序中不可控的,例如常见的OutOfMemoryError堆内存溢出错误,需要来调整堆内存的大小或是查找出程序中导致了大量占用堆内存的地方进而优化。
*Exception是可控的,因此java异常机制主要是针对Exception
检查型异常和非检查型异常的区别
*非检查型异常指的是RuntimeException(运行时异常)及其子类,除此之外的都是检查型异常
当方法体内抛出检查型异常,需要对其进行捕获或者声明在方法上,那么调用该方法的时候就得捕获,或者继续在方法上声明抛出
throw和throws的区别
throw是在方法体中声明可能会抛出一个异常,
throws是在方法上声明该方法一定会抛出一个或多个异常
常见的检查型异常和非检查型异常(运行时异常)
检查型异常:
ClassNotFoundException:类找不到
SQLException:数据库访问相关异常
NoSuchFieldException:变量不存在异常
NoSuchMethodException:NoSuchMethodException 方法不存在 当访问的某个方法不存在的时候抛出此异常
illegalAccessException: 非法访问 当访问某个类被拒绝的时候抛出此异常
InterruptedException:线程中断异常
运行时异常:
RuntimeException: 所有运行时异常的父类
NullPointerException:空指针异常
illegalArgumentException: 参数传递异常
IOException:IO异常
ArithmeticException:运算异常
IndexOutOfBoundsException:索引越界异常
ClassCastException:类型转换异常
反射
在程序运行的过程中,可以动态的创建对象,并获取对象的基本信息,包括属性、方法等
java的反射机制可以不需要使用new一个对象,可以直接使用字符串(即类的全路径名)去创建出一个对象
为什么需要使用反射机制当我们在编译时期无法得知一个对象的类型的时候,即该对象的类型是动态可变的,那么我们就需要用反射机制来获取该对象的类型。
当我们再编译时期无法得知我们需要的是什么类的时候,即该类是动态可变的,那么我们可以通过反射机制使用一个类的完全限定名字符串来获取类以及构建并使用它
当我们需要在程序中获取一个类的所有构造、属性和方法的时候可以使用反射机制
反射获取一个Class对象的三种方式通过类的完全限定名获取:Class.forName(String className)
通过对象获取:object.getClass()
通过类名获取:Object.class()
反射的优缺点
优点:反射的功能即是它的优点
缺点:性能差,打破了封装性
反射的应用spring的IOC机制底层用的就是反射技术来构建用户提供的bean的实例
jdbc为各个厂商提供了驱动规范,各个厂商分别有自己对应的实现,jdbc就是通过用户使用不同类型的驱动类去构建驱动对象的,初始化的时候,通过反射去调用驱动对象的各个方法
下面通过常见的例子看看反射的应用,顺便说点人话:
使用反射主要有两个原因:提高程序的灵活性
屏蔽掉实现的细节,让使用者更加方便好用
jdbc
SpringMvc
学习spring之前是如何获取值的:
//通过html的name属性,获取到值
学习之后呢?
为什么SpringMVC能做到?其实就是通过反射来做的。
相信你也有过的经历:如果你的JavaBean的属性名跟传递过来的参数名不一致,那就“自动组装”失败了。因为反射只能根据参数名去找字段名,如果不一致,那肯定set不进去了。所以就组装失败了呀~
如果在使用框架的时候,为什么我们往往写上JavaBean,保持字段名与参数名相同,就能“自动”得到对应的值呢。这就是反射的好处。
当我们懂得了如何使用反射后,或许大家平时没有使用过反射,但是在开发 Web 项目的时候会遇到过下面的异常:
可以看到异常堆栈指出了异常在 Method 的第 497 的 invoke 方法中,其实这里指的 invoke 方法就是我们反射调用方法中的 invoke。
例如我们经常使用的 Spring 配置中,经常会有相关 Bean 的配置:
当我们在 XML 文件中配置了上面这段配置之后,Spring 便会在启动的时候利用反射去加载对应的 Apple 类。而当 Apple 类不存在或发生启发异常时,异常堆栈便会将异常指向调用的 invoke 方法。
从这里可以看出,我们平常很多框架都使用了反射,而反射中最最终的就是 Method 类的 invoke 方法了。
https://www.zhihu.com/question/377483107/answer/1079967402