【Java面试题】异常和反射

在这里插入图片描述

1、error 和 exception 有什么区别?

error表示系统级的错误,是Java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。

exception表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。

2、说出5个常见的RuntimeException?

RuntimeException:运行时异常,这种异常我们不需要处理,完全由虚拟机接管。比如我们常见的NullPointerException,我们在写程序时不会进行catch或throw。

  1. Java.lang.NuIIPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
  2. Java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
  3. Java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
  4. Java.lang.IllegalArgumentException 方法传递参数错误。
  5. Java.lang.ClassCastException 数据类型转换异常。

3、throw和throws的区别?

throw

  • throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  • throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。

throws

  • throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  • throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
  • throws表示出现异常的一种可能性,并不一定会发生这种异常。

4、Java中异常分类

按照异常处理时机:

  • 编译时异常(受控异常(CheckedException)
  • 运行时异常(非受控异常(UnCheckedException))

5、如何自定义异常

继承Exception是检查性异常,继承RuntimeException是非检查性异常,一般要复写两个构造方法,用throw抛出新异常。

如果同时有很多异常抛出,那可能就是异常链,就是一个异常引发另一个异常,另一个异常引发更多异常,一般我们会找它的原始异常来解决问题,一般会在开头或结尾,异常可通过 initCause 串起来,可以通过自定义异常。

6、Java中异常处理

首先处理异常主要有两种方式:一种try catch,一种是throws。

  • try catch:try{} 中放入可能发生异常的代码。catch{} 中放入对捕获到异常之后的处理。
  • throw throws:
    • throw是语句抛出异常,出现于方法内部,用来抛出一个具体异常实例,throw 被执行后面的语句不起作用,直接转入异常处理阶段。
    • throws是函数方法抛出异常,一般写在方法的头部,抛出异常,给方法的调用者进行解决。

7、什么是Java反射机制?

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

8、举例什么地方用到反射机制?

  1. JDBC中,利用反射动态加载了数据库驱动程序。
  2. Web服务器中利用反射调用了Sevlet的服务方法。
  3. Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
  4. 很多框架都用到反射机制,注入属性,调用方法,如Spring。

9、Java反射机制的作用

  • 在运行时判定任意一个对象所属的类
  • 在运行时构造任意一个类的对象,
  • 在运行时判定任意一个类所具有的成员变量和方法,
  • 在运行时调用任意一个对象的方法;
  • 生成动态代理;

10、Java反射机制类

java.lang.Class; //类
java.lang.reflect.Constructor;//构造⽅方法
java.lang.reflect.Field; //类的成员变量
java.lang.reflect.Method;//类的方法
java.lang.reflect.Modifier;//访问权限

11、反射机制优缺点?

  • 优点:运行期间类型的判断,动态加载类,提高代码灵活度。
  • 缺点:性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的Java代码要慢很多。

12、利用反射创建对象?

1、获取Class对象

反射中,欲获取一个类或者调用某个类的方法,首先要获取到该类的 Class 对象。在 Java API 中,提供了获取 Class 类对象的三种方法:

  • 第一种,使用 Class.forName("全限类名“); 静态方法。前提:已明确类的全路径名。
  • 第二种,使用 类名.class 方法。说明:仅适合在编译前就已经明确要操作的 Class
  • 第三种,使用类对象的 对象.getClass()方法。适合有对象示例的情况下

2、获取对象实例

  • 直接用Class类的对象实例获取对应实例
    Object o = clazz.newInstance();
  • 有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例
/ /获取构造函数类的对象
Constroctor constroctor = clazz.getConstructor(String.class,Integer.class); 
// 使用构造器对象的newInstance方法初始化对象
Object obj = constroctor.newInstance("龙哥", 29); 

代码示例如下:

import java.lang.reflect.Constructor;

public class TestReflection {
 	//User是我们自己编写的一个类,该类所在的包是com.reflection
    public static void main(String[] args) {
		//第一、通过Class.forName方式
        Class clazz1 = null;
        try {
            clazz1 = Class.forName("com.reflection.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
		//第二、通过对象实例方法获取对象
        Class clazz2 = User.class;
 
		//第三、通过Object类的getClass方法
        User user = new User();
        Class clazz3 = user.getClass();
 
        System.out.println(clazz1);
        System.out.println(clazz2);
        System.out.println(clazz3);
 
        User user1 = null;
        try {
             user1 =(User) clazz1.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        user1.setName("终结者");
        user1.setAge(1500);
        System.out.println("user1:"+user1.toString());
 
 
        User user2 = null;
        try {
            // 获取构造函数
            Constructor constroctor = clazz2.getConstructor(String.class,Integer.class);
            // 通过构造器对象的newInstance方法进行对象的初始化
            user2 = (User) constroctor.newInstance("龙哥",29);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("user2:"+user2.toString());
 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值