String says its not null but then later throw NullPointerException - java

OMG. I have a little project to do and the Strings are killing me!
Now, I have a String which is null (is taken the value from invoking getParameter() from a servlet).
The problem is that, I'm trying to see if it's null, and, even if it's null, in the program is telling me that is not null, but later in program, when I'm using the variable, I receive a exception saying the variable is null.
System.out.println("In " + ID); // in console: In null
if ((ID == null) || (ID == "null") || ID.equals(null) || **ID.equals("null")**)
{
// after I put the 4th condition, the if is working right (WHAT IS THE PROBLEM?)
System.out.println("==null");
this.ID = "";
}
else
{
System.out.println("!=null");
this.ID = ID;
}
System.out.println("After " + ID);
What I'm doing wrong?
Only the forth condition is working! What about the rest(except second one, because that condition i put it because I was desperate)
I taught ID == null or ID.equals(null) will be ok, but no.
Edit:
The problem is that, I'm getting the value of the ID from a form(form 1 let's say- usually). But in this case, I'm using form 2 which doesn't have any ID inputs, so ID must be null and not "null"

ID.equals("null")
Clearly, ID contains the four-letter string "null". So it's not null (the value for "nothing").
See the Java glossary for more on the null constant. Basically a variable has the value null if it does not reference any object. The string "null" is an object however, namely an instance of the class String, and in this case the variable ID references this object.
(Note that by convention Java variables start with a lower case letter, and acronyms like ID are written completely lower case, so write id instead of ID.)

Here are the four tests you've tried. The first and the fourth are the only ones that you should need.
ID == null : is the field 'ID' null?
ID == "null": is the ref for the field 'ID' the same as the newly allocated String "null"? This should generally return false.
ID.equals(null): this should always return false - conceptually were this ever true you should throw a NullPointerException.
ID.equals("null"): is the value of the String 'ID' the same as the value of the String "null"?

Since you get the string from a servlet i can say that this is normal.
Java converts a null string to a "null" string on some conditions.
Obviously the string you retrieve is not a null value, but it is a 4 char string "null"
Why don't you try debugging? Or just see what does this return:
System.out.println("Length of ID: " + ID.Length);
Edit: If you don't get exception here, this means that the string is not null and also output "Length of ID: 4" will mean that the string is really ID = "null"
EDIT2: Alright it seems that some guys do not understand what is going on here and they say how can a null string be "null" in some conditions in Java? They find it riddiculus. I prefer them to try this on java:
String abc = null;
String xyz = "hello";
System.out.println(xyz + abc);
The output will be "hellonull" Nothing else...
Also here we have a servlet. There is a null data. Servlet sends the null data as "null" what should it do? An empty string? Come on!!! "

Looks like it is return the String "null" and not a Null Object.

If the result was actually a null then
ID == null
would suffice, but as is mentioned the string value of ID is obviously "null" rather than the null object.
You should use .equals when comparing strings rather than using ==
This blog explains more about his:
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
So, "null" does not equal null, in Java.

If the value is coming from a Servlet then the container is most likely converting an empty form field to a blank string. You should do a check against null and blank ("").
if (value==null || value.equals(""))
Alternatively you can use String's isEmpty() method:
if (value==null || value.isEmpty())

If the value of your variable ID is the string literal "null", then I would guess that there is a bug earlier in the code when you retrieve it using the getParameter() method. According to the docs, the getParameter() method is supposed to return null (the null reference) if there is no value for the specified name. This indicates that somewhere you are doing an operation that converts the result to the string literal, perhaps concatinating with the empty string (i.e. ID + "" ; )

Related

Check if Hashtable.get worked

I'm working with on a Java program that checks a config file integrity.
On some point, I need to ensure that some mandatory values are setted up, either give it a default value.
So, I made a HashTable<String, String> working like a key => value table. On this table I store all the configuration lines on the file, and then I check it.
The problem comes when a specific value does not exist, for example:
String p = null;
/*...*/
//here I'm trying to get the LOG value
p = this.PAIRS.get("LOG");
if(p.equals(null) || p.equals("")){
//set default value
}
The problem is that I'm getting a NullPointerException, so it would be fine if someone can help me on how to determinate if this.PAIRS.get("LOG"); found a key or not...
Thanks!
EDIT: Solved, the right thing was using == and not an equals.
Thanks again!
If p is null, a NullPointerException will be thrown because it is not an instance of an Object (so the equals method doesn't exist). Checking for null should be done the following way : p == null
p = this.PAIRS.get("LOG");
This code return null if the key is not present and when you are doing below statement it will throw exception
if(p.equals(null) || p.equals("")){
//set default value
}
Instead check null first then do .equals
if(p==null || p.equals("")){
//set default value
}

Checking if an object is null before converting to String

I have code that is throwing a null pointer exception.
Here is my code:
StringBuilder strName = new StringBuilder(100);
strName.append(someClassObject.getFirstName().getContent().get(0));
strName.append(" ");
strName.append(someClassObject.getLastName().getContent().get(0));
name = strName.toString();
It is throwing a null pointer exception when trying to retrieve the last name at someClassObject.getLastName().getContent().get(0).
My question is, how to proceed with best practice in catching the null pointer.
What I was thinking something similar to this:
String lastName = (String) someClassObject.getLastName().getContent().get(0);
if(lastName == null) {
lastName = "";
LOGGER.warn("Last name is null");
}
strName.append(lastName);
Which I am hesitant since I have to convert the lastName object to a String and then create logic to check if it is null or not.
Or
try {
strName.append(someClassObject.getLastName().getContent().get(0));
} catch(NullPointerException e) {
LOGGER.warn("Last name of the conusmer is null");
}
The exception only occurs when you call a method withing an already null object (you can debug to see which object is the root null).
In case your null is the someClassObject.getLastName()
You could check nullity in java with this oneliner:
String lastName = (someClassObject.getLastName() == null) ? "" : someClassObject.getLastName().getContent().get(0);
All the overloads of StringBuilder.append() are null safe. They append the text null if the input is null. Hence, you must be getting the NPE from any one of the methods in the expression someClassObject.getLastName().getContent().get(0).
If these methods are not null safe, then it is better to check for null before chaining the next method than catching NPE. This way you might have to write some boilerplate code, but execution time will be cheaper. Exceptions are costly, even if they are handled.
The other option is, if possible change the methods getLastName(), getContent(), and get(), to make them null safe - return empty value instead of throwing NPE. In this case you have to think how the other users of these methods will react if you make this change.
You can use Java 8 Optional to check if object is not null at each level of someClassObject
, as follows:
StringBuilder strName = new StringBuilder(100);
Optional<List<String>> option = Optional.of(someClassObject)
.map(SomeClassObject::getLastName).map(LastName::getContent);
if (option.isPresent()) {
strName.append(option.get().get(0));
}
I would recommend to use the ifPresent option instead, removing the need for your if statement.
Something like:
option.ifPresent(e -> strName.append(option.get().get(0)))

Conditional statement for null check

i have one conditional statement as below
if (Sizeval != null) {
query.addFilterQuery("size:" + Sizeval);
}
In debug i can see value of Sizeval = null
I am getting this value from a request object as below
Sizeval = (String) request.getParameter("Attr");
But even though Sizeval is null its executing the query.addFilterQuery statment.
Any suggestion to rectify this issue plz
To rephrase your question. Given
HttpServletRequest requst = ...
String Sizeval = (String) request.getParameter("Attr");
if (Sizeval != null) {
query.addFilterQuery("size:" + Sizeval);
}
you see that the body of the if is executed (implies Sizeval not null) but still Sizeval seems to be null (as observed in the debugger or in the constructed filter).
Explanation: Sizeval is not null but has the literal value "null". This will add a "size:null" filter query. Also when the variable is viewed in a log or debugger it will seem to be null.
To verify do
if (Sizeval != null) {
if ("null".equals(Sizeval))
throw new IllegalArgumentException("got it");
query.addFilterQuery("size:" + Sizeval);
}
request.getParameter("Attr"); returns null, but you are casting the value to String.
When you check if (Sizeval != null) Sizeval has the value "null" instead of being null object.
request.getParameter already returns String or null, so just drop the casting.
Not 100% but:
If 'request.getParameter("Attr")' returns null, and you cast it to a String, isn't this turned into String 'null'?
Got this problem before.

Oracle ResultSet.getString("colname") returning the string "null" instead of java null

Edit: Subsequent checking of addrline2 (addrline2 == null) reveals that addrline2 is in fact null, printing out the null object resulting in the string "null" going to stdout.
I'm using the Oracle 11g thin client with an Oracle 11g database. When querying a column that contains null, getString("colname") is return a string "null" instead of a Java null value. Is that the expected behavior? Javadoc indicates I should be receiving a Java null.
ResultSet rs = descStatement.executeQuery();
rs.next();
String addrline2 = rs.getString("addressLine2");
System.out.println("addrLine2->"+addrline2+"<-");
boolean wasNull = rs.wasNull();
System.out.println("Wasnull: "+wasNull);
output:
addrLine2->null<-
Wasnull: true
Note that a null object, when converting to a string, prints out as "null". You're not actually checking for null-ness anywhere.
Try adding
if (addrline2 == null) {
System.out.println("It's null!")
}
rs.getString("addressLine2") is returning null only but when yo do
System.out.println("addrLine2->"+addrline2+"<-");
its printing null as string literal
do it like this
System.out.println("addrLine2->"+addrline2!=null ? addrline2 : "Its null"+"<-");

ArrayList.contains("text") throws NullPointerException?

I'm to trying to make an android app where I accept input from the user using the speech Recognition server. I'm capturing the results in a ArrayList as follows :
matches = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
matches is declared globally as :
ArrayList<string> matches;
Now I want to check if the user has spoken a particular word. So I do this :
if(matches.contains("TextToBeDetected")) { }
But the line above throws a NullPointerException.
Please help.
P.S Yes, I'm a Java and Android newbie.
Obviously, your matches is null. As per the Intent documentation, http://developer.android.com/reference/android/content/Intent.html#getStringArrayListExtra%28java.lang.String%29
getStringArrayListExtra returns null if the key is not found in the bundle.
Test for nullity before testing if it contains anything
It sounds as though getStringArrayListExtra is returning null (the docs say it will if there is such ArrayList value found), and so when you try matches.contains("TextToBeDetected") it fails because you're trying to dereference a null reference. You'll want to check the return value from getStringArrayListExtra to make sure it's not null before you use it. E.g.:
matches = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
// ...
if (matches != null) {
if (matches.contains("TextToBeDetected")) {
// do something
}
}
If you see the docs Android.Content.Intent.GetStringArrayListExtra It says
the value of an item that previously added with putExtra() or null if no ArrayList value was found.
You need to check for the list being null before setting it to matches.
Are you sure that matches is allocated?
Try this, and look at your logcat output:
if (matches == null) {
Log.d("YourAppName", "matches is null!");
} else if (matches.contains("TextToBeDetected")) {
Log.d("YourAppName", "matches does contain TextToBeDetected");
} else {
Log.d("YourAppName", "matches does not contain TextToBeDetected");
}
data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
will return the value of an item that previously added with putExtra() or null if no ArrayList value was found. In your case, maybe it returned null

Categories