【问题标题】: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。即使它没有对象,它仍然有一个类型。我如何获取对象的类型,无论它是否包含对象。

【问题讨论】:

  • 它没有类型,它是null

标签: 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

【讨论】:

    【解决方案2】:

    其他人都正确地回答说没有类型,因为没有对象,但如果我没看错的话,我认为你真正要问的是如何检查你的变量已分配的类型。

    为此,我将参考此链接: How to check type of variable in Java?

    【讨论】:

      【解决方案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);
              }
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-10-17
                • 2012-08-22
                • 2015-10-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-09-05
                • 1970-01-01
                相关资源
                最近更新 更多