(Unknown Source) in Exception stack trace
Solution 1
This is normally related to missing debug information. You are probably using JRE (not JDK), which does not include debug information for rt.jar classes. Try using full JDK, you'll get proper locations in the stack trace:
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(String.java:177)
at java.lang.String.valueOf(String.java:2840)
at StringValueOfNull.main(StringValueOfNull.java:3)
Solution 2
Note that if you are using Ant build and if the debug attribute set to false in javac command this could happen.
ex : if you need proper location in trace set debug = true in Ant build,
<javac verbose="false" srcdir="${src}" destdir="${classdir}" debug="true" includes="**/*.java">
<classpath refid="compile.classpath" />
</javac>
Solution 3
I had the same problem, I'm using spring and apache ant for continuous integration.
The error I had was in the build.xml file.
The gender change log with more precise content was:
build.xml with the error:
<javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes">
<classpath refid="compile.classpath" />
</javac>
build.xml without error:
<javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes" debug="true">
<classpath refid="compile.classpath" />
</javac>
Within the structure I lacked the courage debug = "true"
Solution 4
I ran the code in Eclipse and I got the following output,
public class Aloof {
public static void main(String[] args) {
String.valueOf(null);
}
}
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(String.java:177)
at java.lang.String.valueOf(String.java:2840)
at mysql.Aloof.main(Aloof.java:19)
If you include the full source (from JDK), you can actually debug to the line 177 in String.java
Solution 5
This happens when there is no debug (line) information in the source or the VM is told to throw that information away at class loading time. Since you have some line numbers, it's not the VM setting but the class String
is missing debug information.
polygenelubricants
I mostly contributed in [java] and [regex] from February to August of 2010. I work for Palantir Technologies now, so I may not have much time on stackoverflow as I did then. We're currently hiring; you can e-mail me for a referral. A few habits I've developed on the site: I will no longer cast a downvote. It will stay at 54 forever. I don't like to engage in dramas on stackoverflow. If you really need to discuss politics and other non-technical issues with me, bring it to meta. I delete my comments once they've become obsolete I try to revise my answers periodically, so I prefer that you leave comments and feedbacks instead of editing my answers directly.
Updated on July 09, 2022Comments
-
polygenelubricants almost 2 years
Background
This question is related to Why does String.valueOf(null) throw a NullPointerException?
Consider the following snippet:
public class StringValueOfNull { public static void main(String[] args) { String.valueOf(null); // programmer intention is to invoke valueOf(Object), but instead // code invokes valueOf(char[]) and throws NullPointerException } }
As explained in the answer to the linked question, Java's method overloading resolves the above invokation to
String.valueOf(char[])
, which rightfully results in aNullPointerException
at run-time.Compiled in Eclipse and
javac 1.6.0_17
, this is the stack trace:Exception in thread "main" java.lang.NullPointerException at java.lang.String.<init>(Unknown Source) at java.lang.String.valueOf(Unknown Source) at StringValueOfNull.main(StringValueOfNull.java:3)
Note that the stack trace above is missing the KEY information: it does NOT have the full signature of the
valueOf
method! It just saysString.valueOf(Unknown Source)
!In most situations I've encountered, exception stack traces always have the complete signature of the methods that are actually in the stack trace, which of course is very helpful in identifying the problem immediately and a major reason why the stack trace (which needless to say is rather expensive to construct) is provided in the first place.
And yet, in this case, the stack trace does not help at all. It has failed miserably in helping the programmer identify the problem.
As is, I can see 3 ways that a programmer can identify the problem with the above snippet:
- Programmer realizes on his/her own that the method is overloaded, and by resolution rule, the "wrong" overload gets invoked in this case
- Programmer uses a good IDE that allows him/her to quickly see which method is selected
- In Eclipse, for example, mouse-hovering on the above expression quickly tells programmer that the
String valueOf(char[] data)
is indeed the one selected
- In Eclipse, for example, mouse-hovering on the above expression quickly tells programmer that the
- Programmer examines the bytecode (ugh!)
The last option is probably the least accessible, but of course is the Ultimate Answer (a programmer may misunderstood the overloading rule, IDE may be buggy, but bytecodes always(?) tell the truth on what's being done).
The questions
- Why is the stack trace so uninformative in this case with regards to the signatures of the methods that are actually in the stack trace?
- Is this due to the compiler? The runtime? Something else?
- In what other (rare?) scenarios can the stack trace fail to capture essential information like these?
-
James Raitsev over 12 yearsThis did it for me. Very nice tip
-
FreewheelNat about 11 yearsIn NetBeans, right click on properties, then in Build/Compiling tab, make sure "Generate Debugging Information" is ticked.
-
ironwood over 10 yearsVery useful. I suggest this to be the approved answer.
-
justian17 about 10 yearsHi guys! I know it's been a few years but... I'm using ant's javac, without any special (anti-debugging) arguments, and all of my system and project paths are pointing to my JDK, not the JRE installation. What else could be producing the "Unknown source?"
-
Mugoma J. Okomba about 8 yearsStruggled for an solution till I scrolled down to this. Saved my day.
-
JoeManiaci about 8 yearsDidn't work for me, added debug="true" debuglevel="lines,vars,source"
-
MasterJoe almost 7 yearsThis did not work for me. I have a maven project. Project java build path uses JDK library. I see the unknown source error in the code of a non-jdk library. How do I fix it ?
-
MasterJoe almost 7 yearsI have a maven project. Project java build path uses JDK library. I see the unknown source error in the code of a non-jdk library. How do I fix it ?
-
MasterJoe over 6 yearsHow do you include full source from JDK ?
-
huch almost 6 yearsIf you're just using
javac
to compile your sources, you can enable debug infos with-g
command line flag. -
huch almost 6 yearsPlease note that javac does generate line number and source file debug info, without the need to add
-g
flag. All kinds of IDEs and build tools (eg. mvn, ant, gradle) may have different means to enable or disable the debug info.