繁体   English   中英

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

[英]Get type of an object with an object of null?

以下代码编译,但为什么我会得到运行时异常?

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

我得到的错误是

java.lang.NullPointerException

即使将对象设置为null,如何获取对象的类型?

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

当你有

String b = null;

你实际拥有的是一个引用null的引用类型String变量。 您不能取消引用null来调用方法。

使用局部变量,您无法按照要求执行操作。

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

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

这里没有对象, null没有类型。
你不能这样做。

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

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

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

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

为此,我将参考此链接: 如何检查Java中的变量类型?

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

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

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

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

所以在那个陈述中没有对象。 这就是你得到NullPointerException的原因。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM