【问题标题】:Get type of an object with an object of null?获取具有 null 对象的对象的类型?
【发布时间】:2018-08-14 14:17:56
【问题描述】:
以下代码可以编译,但为什么会出现运行时异常?
String b = null;
System.out.println(b.getClass());
我得到的错误是
java.lang.NullPointerException
即使设置为null,如何获取对象的类型?
编辑
我意识到没有对象存在,但仍然有一个字符串类型的对象 b。即使它没有对象,它仍然有一个类型。我如何获取对象的类型,无论它是否包含对象。
【问题讨论】:
标签:
java
runtime
runtime-error
【解决方案1】:
当你有
String b = null;
您实际拥有的是一个引用类型为String 的变量,它引用了null。您不能取消引用 null 来调用方法。
使用局部变量,你不能做你所要求的。
通过成员变量,可以使用反射来查找字段的声明类型。
Field field = YourClass.class.getDeclaredField("b");
Class<?> clazz = field.getType(); // Class object for java.lang.String
【解决方案3】:
这里没有对象,null 没有类型。
你不能那样做。
【解决方案4】:
变量与对象不同。变量是对象的引用。
如果您尝试取消引用 null 引用(即,如果您尝试通过 null 引用调用方法或访问成员变量),则会得到 NullPointerException。
当变量为null时,表示它没有引用任何对象。当然你不能得到“无对象”的类型。
【解决方案5】:
空引用没有类型。没有对象被指向,所以你不能在不存在的对象上调用.getClass()。
如果您正在寻找编译时类型,您可以改写String.class。
【解决方案6】:
要回答您的问题,您必须了解您所写的内容。
String b = null; 可以翻译成。为 String 类保留内存空间并用 null 填充它。
因此,该声明中没有对象。这就是你得到 NullPointerException 的原因。
要检索此类声明的类型,您可以使用反射机制,但它仅适用于类成员。
【解决方案7】:
由于上述答案是正确的,这是不可能的。我想出的最接近的是:
<T extends Object> String typeAndValue(Class<T> type, T value) {
return type.getClass.getSimpleName() + " is: " + String.valueOf(value);
}
你需要显式地传递类型,但你不能传递任何不同于合适类型的东西(仍然可能是超类),因为它不会编译。