获取对象为null的对象类型?

时间:2013-12-04 14:36:53

标签: java runtime runtime-error

以下代码会编译,但为什么会出现运行时异常?

String b = null;
System.out.println(b.getClass());

我得到的错误是

java.lang.NullPointerException

如果对象的类型设置为null,我怎样才能得到对象的类型?

修改 我意识到没有对象存在,但仍然存在String类型的对象b。即使它没有对象,它仍然有一个类型。如何获取对象的类型,无论它是否包含对象,或者它是否包含对象。

7 个答案:

答案 0 :(得分:12)

当你有

String b = null;

您实际拥有的是引用null的引用类型String的变量。您无法取消引用null来调用方法。

使用局部变量,您无法按照自己的要求进行操作。

使用成员变量,您可以使用反射来查找字段的声明类型。

Field field = YourClass.class.getDeclaredField("b");
Class<?> clazz = field.getType(); // Class object for java.lang.String

答案 1 :(得分:3)

此处没有任何对象,null没有类型 你不能这样做。

答案 2 :(得分:3)

变量对象不同。变量是对象的引用

如果您尝试取消引用NullPointerException引用(例如,如果您尝试通过null引用调用方法或访问成员变量),则会得到null

当变量为null时,表示它不引用任何对象。当然你不能得到“没有对象”的类型。

答案 3 :(得分:3)

其他人已经恰当地回答说没有类型,因为没有对象,但是如果我正确地读到这个,我认为你真正要问的是如何检查你的变量被分配的类型。

为此我会参考这个链接: How to check type of variable in Java?

答案 4 :(得分:0)

空引用没有类型。没有指向任何对象,因此您无法在不存在的对象上调用.getClass()

如果您正在寻找编译时类型,则可以改为编写String.class

答案 5 :(得分:0)

要回答你的问题,你必须明白你写的是什么。

String b = null;可以翻译成。在String类的内存空间中保留并用null填充它。

因此该声明中没有对象。这就是你得到NullPointerException的原因。

要检索此类声明的类型,您可以使用反射机制,但它仅适用于类成员。

答案 6 :(得分:0)

由于上述answas状态正确,因此这是不可能的。我想出的最接近的是:

<T extends Object> String typeAndValue(Class<T> type, T value) {
    return type.getClass.getSimpleName() + " is: " + String.valueOf(value);
}

您需要显式传递类型,但是您不能传递与合适类型不同的任何东西(仍然可能是超类),因为它不会编译。