15

The following code does compile, but why do I get a run time exception?

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

Error I get is

java.lang.NullPointerException

How can I get the type of the object even if it's set to null?

Edit I realize there is no object present, but there still is an object b of type String. Even if it holds no object, it still has a type. How do I get at the type of an object, regardless of if it holds an object or if it does not.

Monte Carlo
  • 447
  • 2
  • 6
  • 14

7 Answers7

17

When you have

String b = null;

what you actually have is a variable of reference type String that is referencing null. You cannot dereference null to invoke a method.

With local variables you cannot do what you are asking.

With member variables, you can use reflection to find the declared type of the field.

Field field = YourClass.class.getDeclaredField("b");
Class<?> clazz = field.getType(); // Class object for java.lang.String
Sotirios Delimanolis
  • 274,122
  • 60
  • 696
  • 724
4

Everyone else has appropriately answered that there is no type as there is no object but if I'm reading this correctly, I think what you are really asking is about how to check the type that your variable has been assigned.

For that I would refer to this link: How to check type of variable in Java?

Community
  • 1
  • 1
3

There is no object here, and null has no type.
You can't do that.

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
3

A variable is not the same as an object. A variable is a reference to an object.

You get a NullPointerException if you try to dereference a null reference (i.e., if you try to call a method or access a member variable through a null reference).

When a variable is null, it means it refers to no object. Ofcourse you can't get the type of "no object".

Jesper
  • 202,709
  • 46
  • 318
  • 350
0

Null references don't have a type. There's no object being pointed to, so you can't call .getClass() on the non-existent object.

If you're looking for the compile-time type, you can write String.class instead.

John Kugelman
  • 349,597
  • 67
  • 533
  • 578
0

To answer to your question you must understand what have you written.

String b = null; can be translated to. Reserve in memory space for a String class and fill it with null.

So there is not object in that statement. That is why you get NullPointerException.

To retrieve the type of such declaration you can use reflection mechanism but it only apply to class members.

0

As the above answas state correcty, this is not possible. The closest I came up with is this:

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

You need to explicitly pass the type, but you cannot pass anything different than a suitable type (still may be supperclass) because it would not compile.

Matthias Ronge
  • 9,403
  • 7
  • 47
  • 63