以下代码会编译,但为什么会出现运行时异常?
String b = null;
System.out.println(b.getClass());
我得到的错误是
java.lang.NullPointerException
如果对象的类型设置为null,我怎样才能得到对象的类型?
修改 我意识到没有对象存在,但仍然存在String类型的对象b。即使它没有对象,它仍然有一个类型。如何获取对象的类型,无论它是否包含对象,或者它是否包含对象。
答案 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);
}
您需要显式传递类型,但是您不能传递与合适类型不同的任何东西(仍然可能是超类),因为它不会编译。