Wednesday, June 8, 2016

How do I read the NPE stacktrace?

Suppose that I compile and run the program above:
$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:4)
$
First observation: the compilation succeeds! The problem in the program is NOT a compilation error. It is a runtime error. (Some IDEs may warn your program will always throw an exception ... but the standard javac compiler doesn't.)
Second observation: when I run the program, it outputs too lines of "gobbledy-gook". WRONG!!That's not gobbledy-gook. It is a stacktrace ... and it provides vital information that will help you track down the error in your code, if you take the time to read it carefully.
So lets look at what is says:
Exception in thread "main" java.lang.NullPointerException
The first line of the stack trace tells you a number of things:
  • It tells you the name of the Java thread in which the exception was thrown. For a simple program with one thread (like this one), it will be "main". Lets move on ...
  • It tells you the full name of the exception that was thrown; i.e. java.lang.NullPointerException.
  • If the exception has an associated error message, that will be output after the exception name.NullPointerException is unusual in this respect because it rarely has an error message.
The second line is the most important one in diagnosing an NPE.
at Test.main(Test.java:4)
This tells us a number of things:
  • "at Test.main" says that we were in the main method of the Test class.
  • "Test.java:4" gives the source filename of the class, AND it tells us that the statement where this occurred is in line 4 of the file.
And if you count the lines in the file above, line 4 is the one that I labelled with the "HERE" comment.
Note that in a more complicated example, there will be lots of lines in the NPE stack trace. But you can be sure that the second line (the first "at" line) will tell you where the NPE was thrown1.
In short the stacktrace will tell us unambiguously which statement of the program has thrown the NPE.
1 - Not quite true. There are things called nested exceptions ...

No comments:

Post a Comment