arraystoreexception是什么异常_反射、对象拷贝、异常 常见问题整理

b7e0949137a5bde0bbeee4302d31850d.png

壹、反射

一.什么是反射?

请移步:http://zhuanlan.zhihu.com/p/203304567


二.什么是 java 序列化?什么情况下需要序列化?

1.序列化和反序列化的意义

(1)序列化:将 Java对象转换成字节流的过程(将对象实例的状态存储到存储媒体的过程)

(2)反序列化:将字节流转换成Java对象的过程(将存储在存储媒体中的对象状态装换成对象的过程)

2.序列化/反序列化的基本原理

(1)序列化是采用流的方式将对象的状态存储在文件中。
(2)反序列化就是采用流的方式将文件中的数据读出,并且根据读取的类型的名称,经过反射形成类,然后再将读取到的状态数据赋值给创建的对象。

3.什么时候使用

当 Java 对象需要在网络上传输或者持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

4.序列化的实现

类实现 Serializable接口,这个接口没有需要实现的方法。

实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

5.注意事项

(1)某个类可以被序列化,则其子类也可以被序列化

(2)声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据

(3)反序列化读取序列化对象的顺序要保持一致


三.动态代理是什么?有哪些应用?

1.动态代理

可以对实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。给这个类创建一个代理类,这个类不仅包含原来类方法的功能,还在原来的基础上添加了额外处理。这个代理类并不是预先定义好的,是动态生成的。有解耦,灵活,扩展性强的优点。

2.动态代理实现:

(1)定义一个接口

(2)定义InvocationHandler(将实现接口的类的对象传递给它)处理类。

(3)定义工具类Proxy(代理类,因为调用他的newInstance()可以产生代理对象)。

(4)利用InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

3.动态代理的应用

Spring的AOP,加事务,加权限,加日志。


贰、对象拷贝

一.为什么要使用克隆?

克隆一个新对象,新旧两个对象是完全两个不同的内存地址,修改一个对象的值,不会影响到另外一个。


二.如何实现对象克隆?

1.实现Cloneable接口,并重写object类中的clone方法,可以实现浅克隆,也可以实现深度克隆。

2.实现Serializable,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。

3.利用BeanUtils,apache和spring都提供了这个bean工具。只是他也是浅克隆。


三.深拷贝和浅拷贝区别是什么?

1.浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。

2.深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。

深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象


叁、异常

一.throw 和 throws 的区别?

Throw:

1.作用在方法内,表示抛出具体异常,由方法体内的语句处理。

2.具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。

Throws:

1.作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。

2.主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。

3.出现异常是一种可能性,但不一定会发生异常。

实例:

void testException(int a) throws IOException,{
try{
......
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出错了!");
}
if(a!=b)
throw new Exception3("自定义异常");
}


二.final、finally、finalize 有什么区别?

final

(1)final关键字用于基本数据类型前:这时表明该关键字修饰的变量是一个常量,在定义后该变量的值就不能被修改。

(2)final关键字用于方法声明前:这时意味着该方法时最终方法,只能被调用,不能被覆盖,但是可以被重载。

(3)final关键字用于类名前:此时该类被称为最终类,该类不能被其他类继承。

finally

在try-catch-finally中一定会被执行的部分,例如用来关闭资源

finalize

finalize方法来自于java.lang.Object,用于回收资源。

可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。

在实际应用中,不要依赖使用该方法回收任何短缺的资源,这是因为很难知道这个方法什么时候被调用。


三.try-catch-finally 中哪个部分可以省略?

可以省略catch或者finally。catch和finally不可以同时省略。


四.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。

(2)如果在catch中return了,也会在return之前,先执行finally代码块。

(3)而且如果finally代码块中含有return语句,会覆盖其他地方的return。

(4)对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。

注:finally也不是一定会被执行,如果在try代码块中,System.exit()强制退出程序,或者在执行try代码块中报错抛出异常(例如5/0),finally代码块就不会执行了。


五.常见的异常类有哪些?

1.NullPointerException 当应用程序试图访问空对象时,则抛出该异常。
2.SQLException 提供关于数据库访问错误或其他错误信息的异常。
3.IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
4.NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
5.FileNotFoundException当试图打开指定路径名表示的文件失败时,抛出此异常。
6.IOException当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
7.ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
8.ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
9.IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
10.ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
11.NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
12.NoSuchMethodException无法找到某一特定方法时,抛出该异常。
13.SecurityException由安全管理器抛出的异常,指示存在安全侵犯。
14.UnsupportedOperationException当不支持请求的操作时,抛出该异常。
15.RuntimeException 是那些可能在Java虚拟机正常运行期间抛出的异常的超类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值