FIVE------异常+反射+内部类+泛型+序列化

267 阅读4分钟

**1、**异常是指方法不能按照正常方式完成时,可以通过抛出异常的方式退出该方法。

在Java中异常分为两大类:Error和Exception:

Error是无法处理的异常,比如OutOfMemoryError,一般发生这种异常,JVM会选择终止程序。
因此我们编写程序时不需要关心这类异常。

Exception,也就是我们经常见到的一些异常情况,比如NullPointerExceptionIndexOutOfBoundsException,
这些异常是我们可以处理的异常

2、Java中如何处理异常

• 抛出异常

抛出异常有3种形式:throwthrows、系统自动抛出异常

• 使用try...catch语句块捕获并处理异常

    try {
         //具体的业务逻辑实现
        } catch (Exception e) {
         // 捕获异常并处理
        }

3、 throw 和 throws 的区别?
• 位置不同:

throws 作用在方法上,后面跟着异常的类
而throw作用在方法内,后面跟着异常的对象

• 功能不同:

throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,
而是由该方法的调用者来进行异常处理

而throw则是指抛出的一个具体的异常类型,由方法体内的语句处理
void testException(int a) throws IOException{
           try{
                 ......
           }catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出错了!");
           }
           if(a!=b)
              throw new  Exception3("自定义异常");
}

4、final、finally、finalize 有什么区别?

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

会执行,在 return 前执行

6、常见的异常类有哪些?

SQLException:提供关于数据库访问错误或其他错误信息的异常

IndexOutOfBoundsException:数组下标越界异常

ClassNotFoundException:指定的类不存在  

7、什么是Java反射?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有方法和属性;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

8、什么是Java内部类?

在Java中定义在一个类或者方法里面的类之称为内部类。包含以下四种:

成员内部类
静态内部类
局部内部类
匿名内部类

9、什么是泛型,使用泛型的好处

泛型是JDK5中引入的一个新特性,本质即参数化类型,也就是所操作的数据类型被指定为一个参数

例如,ArrayList类用一个类型参数来指出元素的类型
ArrayList<String> stringValues=new ArrayList<String>();
这样的代码具有更好的可读性,我们一看就知道该集合用来保存String类型的对象,而不是仅仅依赖变量名称来暗示我们期望的类型。

    public class GenericType {
    	public static void main(String[] args) {  
    		ArrayList<String> stringValues=new ArrayList<String>();
    		stringValues.add("str");
    		stringValues.add(1); //编译错误
    	} 
    }

如果我们向ArrayList<String>添加Integer类型的对象,将会出现编译错误。 Exceptioninthread"main"java.lang.Error:\color{red}{Exception in thread "main" java.lang.Error: } 编译器会自动帮我们检查,避免向集合中插入错误类型的对象,从而使得程序具有更好的安全性。

总之,泛型通过类型参数使得我们的程序具有更好的可读性和安全性,消除强制类型转换。 

10、泛型实现原理

类型擦除:

Java中的泛型基本上都是在编译器这个层次来实现的,使用泛型的时候加上的类型参数会在编译器在编译的时候去掉,
在生成的Java字节码中是不包含泛型中的类型信息的,这个过程就称为类型擦除。

比如List<Integer>List<String>类型,在编译后都会变成List类型(原始类型)。Java中的泛型基本上都是在编译器这个层次来实现的,这也是Java的泛型被称为“伪泛型”的原因

11、 什么是 Java 序列化?什么情况下需要序列化?序列化的实现方式?

在使用Java序列化技术保存对象及其状态信息时,对象及其状态信息会被保存在一组字节序列中,在需要的时候再将这些字节序列反序列化为对象。

序列化:序列化是将对象转化为字节流。

反序列化:反序列化是将字节流转化为对象

序列化的用途

序列化可以将对象的字节序列持久化地保存在内存、文件、数据库中

在网络上传送对象的字节序列

(RMI)远程方法调用(RMI的目的就是要使运行在不同的计算机中的对象之间的调用表现得像本地调用一样)

序列化的实现方式

相应的对象实现了Serializable接口[ˈsɪərɪəlaɪzəbl]。这个接口没有需要实现的方法,
实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

实现序列化的第二种方式为实现Externalizable接口[ɪkˈstɜːnlaɪzəbl]

注意事项:

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

被 statictransient 修饰的变量,不能被序列化。
transient 表示临时数据[ˈtrænziənt]