异常的分类
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: Error 和 Exception。其中 Error
用来表示 JVM 无法处理的错误,比如OutOfMemoryError堆溢出错误,栈溢出错误。
Exception 分为两种:
受检异常(非运行时异常) :这些异常必须经过 try…catch… 语句捕捉检查处理的,否则不能通过
编译。如 IOException操作输入流或者输出流的可能出现的异常、SQLException SQL语句可能出现的异常等。
运行时异常:都是 RuntimeException 类及其子类,如 NullPointerException、
IndexOutOfBoundsException、ClassNotFoundException 找不到类异常 等, 在程序运行的时候可能会发生的, 所以程序可以捕捉,也可以不捕捉。这些错误一般是由程序的逻辑错误引起的, 应该从程序逻辑角度去尽量避免。
异常的处理
异常的处理分为 消极处理(自己处理不了,就往调用它的地方上抛throws,异常没有解决,只是抛出)和 积极处理(异常捕获,捕获异常通过try-catch语句或者try-catch-finally语句实现)
消极的处理:
语法: public void m1() throws 异常类名1,异常类名2{}
特点:相当于推卸责任,最终问题依然无法得到解决。允许编译通过。
当上抛的异常为非运行(已检查)时异常时,调用此方法的调用者必须处理。
当上抛的异常为运行(未检查)时异常时,可以处理可以不处理。
throw和throws的区别
throw是用在方法体里面的,一般是放在判断情况的后面,手动抛出异常
throws只能用在需要捕获异常的方法的方法名的括号后面使用。
JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?
throws 是获取异常
throw 是抛出异常
try 是将会发生异常的语句括起来,从而进行异常的处理,也可以在 try 块中抛出新的异常
catch 是如果有异常就会执行他里面的语句
finally 不论是否有异常都会进行执行的语句
反射
反射
-被视为动态语言的关键,java在加载完类之后,在堆内存的方法区会产生一个Class类型的对象,一个类只有一个Class对象,这个对象包含了完整的类的结构信息,可以通过这个对象看到类的结构。
-相关API:java.lang.Class代表一个类 Class的实例就对应着一个运行时的类。
21、什么是反射机制?
(1)java的反射机制是指在运行状态,对于任意一个类,都能知道这个类的属性和方法,对于任意一个对象,都能调用他的任意的方法和属性,这种动态获取的信息以及动态调用的方法叫做反射机制。
原理是通过获得类的class对象,再去获得类或者对象的各种信息。
(2)获取class对象的三种方法
通过Class.forName(“全类名”)
类名.class
对象.getClass()
然后根据class对象获取类的各种信息 : getMethods()获取所有public方法,getConstructors()获取构造方法,获取getDeclaredFields()获取所有的属性。class.newInstance() ,并强转类型,然后就可以操作对象了。
反射的优点:
● 可扩展性 :应用程序可以利用全限定名创建外部的用户自定义类的实例。
● 透明性:对于任意一个类,都能够知道这个类的所有字段和方法,并且使用它们。
反射的缺点:
尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使
用反射技术时,下面几条内容应该牢记于心。
● 性能开销 :反射涉及了动态类型的解析,所以 JVM 无法对这些反射代码进行优化。因此,
反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很
高的程序中使用反射。
● 安全限制 :使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必
须在有安全限制的环境中运行,如 Applet,那么这就是个问题了。
● 内部暴露 :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性
和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植
性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。
23、反射机制的应用场景
(1)在使用spring框架的时候,通过解析xml文件,获取id属性和class属性,然后通过反射的方式获得类的实例对象,然后初始化到spring的bean容器里面。
(2)在使用jdbc连接数据库的时候,会使用class.forName通过反射来获取数据库的驱动程序。