Null Pointer Exception in If condition - java

Product p = dao.checkProduct(pnumber);
ExpensiveProduct ep = dao.checkexpensiveProduct(pnumber);
if ((p.getNumber() == null)&&(ep.getNumber()==null) ){ // java.lang.NullPointerException
//do something
}else{
//do something
}
Why this statement giving java.lang.NullPointerException
Do I have any other way to check this?

The only non-trivial possibility where this code can throw NPE is pnumber being Integer where checkProduct() or checkexpensiveProduct() expects int (or similar).
Other trivial reasons are dao or p being null (easy to check).

Try it like this:
if ((p != null) && (p.getNumber() == null) && (ep != null) && (ep.getNumber()==null) ){

NullPointerExceptions (NPEs) occur when you call a method or access a property of a null object.
To check for nulls, you could print the values of your variables before you try to use them, or step through your program with a debugger and check what the variables' values are when you reach the line where the exception happens.
EDIT:
Regarding your comment
i need to check p.getNumber() and ep.getNumber() both returning null and get ture on that statement
your existing code
if ((p.getNumber() == null)&&(ep.getNumber()==null) )
is already doing that. Since you're getting an NPE on that line, p itself is null, or ep is null, or both. You should examine your checkProduct() and checkexpensiveProduct() methods, where p and ep are set, to see if they're working correctly.

check your p variable and ep variable .One of them is null.check
why
dao.checkProduct(pnumber)
or
dao.checkexpensiveProduct(pnumber); is returning null

What line is giving the NullPointerException? Be sure that p or ep are not null.

Related

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)))

Handle Nullpointerexception after SQL query has no result

I've got a MVC based Java application with three models: Room, Student and StudentRoom.
StudentRoom contains an object of Room and Student.
Now I've got the problem that if my SQL query returns no result and I check the value of student's name like this
if(studentRoom.student.name != null) {
}
I'll get a NullPointerException and I don't know how to handle it.
Should I set Student.name = ""; since my query has no result?
if(studentRoom != null && studentRoom.student != null && studentRoom.student.name != null){
//.. Access student
}
Above solution looks a bit weird. you should better use getter/setter methods instead of directly accessing the objects.
Apart from that you can define methods like isStudentAvailable() in studentRoom to check whether it has Student in it or not.
Should I set Student.name = ""; since my query has no result ?
It completely depends on your use case. But I must say better to keep it null as it will raise the exception instead of passing the null check validations.
You might need a try/catch statement for that. Something like this :
try {
// do process here
} catch (NullPointerException npe) {
//to do if student is null
}
But take note, if there are any object that is inside the try statement, a NullPointerException would still be thrown. Hope this helps.

I am getting null pointer exception for following program

/*line 1.*/
if((name!=null || address!=null)||(!(name.equals("")||address.equals("")))){
sessionNameModel.setObject(""+name);
sessionAddressModel.setObject(""+address);
add(sessionName);
add(sessionAddress);
}
else{
sessionNameModel.setObject("");
sessionAddressModel.setObject("");
add(sessionName);
add(sessionAddress);
}
I am getting null pointer exception in line 1. I know the value of name and address field is null but i have to check in cases when session updates the value. i need to know how to check these variables name and address as null or not..
Assuming that your condition is correct, change:
if((name!=null || address!=null)||(!(name.equals("")||address.equals("")))){
to:
if((name!=null || address!=null)||(!("".equals(name)||"".equals(address)))){
Explanation:
by using "".equals(name) you guarantee that even if name is null (which is possible since you're using || in the previous expression) the comparison will return false instead of NPE. Same goes for address.
if((name!=null || address!=null)||(!(name.equals("")||address.equals(""))))
Here if name==null still you are checking for name.equals which may cause nullpointer same thing happens for address.Instead use && for checking equals only if it's not null.Or you can use "".equals as suggested by alfasin
if((name!=null && !name.equals(""))||((address!=null && !address.equals(""))))
Apart from the discussion,
I think here use of || not needed instead use && as here || can add null in your session which is not proper.
if((name!=null && !name.equals(""))&&((address!=null && !address.equals(""))))
You can try like this
if((name !=null || name.length()==0) && (address!=null || address.length()==0)){
}
else{
}
name = null;
address = null;
if((name!=null || address!=null)||(!(name.equals("")||address.equals(""))))
Analysis;
first checks name!=null, it's false
then checks address!=null, which is false either
then it tries to check if name.equals(""), but since name is null, it will crash because there is no object as name and so no method as equals
as looking at the other lines you have to change the line as
if((name!=null && address!=null)&&(!(name.equals("")||address.equals(""))))
Let's analyse the new line;
first checks name!=null, which is false
since all other conditions are combined with AND and since one of them is false, no need to check anything else, so executes the second line
At first cobait is right:
if((name!=null || address!=null)||(!(name.equals("")||address.equals(""))))
If either the variable name or the variable address is null, the following code will still be executed. This is probably causing your nullpointer.
Better expression would be if((name != null) && (address != null)) ....
If you want to execute the code for at least for one of the variables, if it is not null, you should split your if statements.
Another alternative for your check would be using the apache commons library and call the function isBlank(). This function checks both, if the String is not null and if it's not emtpy.

NullPointerException not catching properly in GUI

I have this code to bring up a message if my list is empty. The first time it works and I get my JOptionPane. However, if I add an item to the list and then remove it and hit remove if the list is empty again, I get NullPointerException error. Is there a reason for this?
The culprit is :
String selectListValue = selectionList.getSelectedValue().toString();
and also
if(selectListData.size() > 0)
// Null pointer exception will be thrown is selctionData is Null
In this you are not checking if selectionList is null. Ideally you should check if a object is null before performing any operation on it.
Correct Way :
if(selectionList != null)
{
String selectListValue = selectionList.getSelectedValue().toString();
// perform yoour operations
}
Also change :
if(selectListData != null && selectListData.size() > 0)

java.lang.NullPointerException [duplicate]

This question already has answers here:
What is a NullPointerException, and how do I fix it?
(12 answers)
Closed 2 years ago.
I do a condition with a value when it is null and when it is not null.
The time where this value is null I got the java.lang.NullPointerException.
How could I deal with this in order to dismiss this exception?
I need the condition when the value is null and when it is not.
You get a NullPointerException when you try to call a method using a variable that is null. Simple example:
String s = null;
int len = s.length(); // NullPointerException because s is null
So you should check if the variable is null before calling any method on it, for example:
int len;
if (s == null) {
len = 0;
}
else {
len = s.length(); // Safe, s is never null when you get here
}
Note that a NullPointerException is usually easy to solve. Carefully look at the stack trace of the exception; it tells you exactly in which line of your code the exception happens. Check what could be null in that line of code, and check if you're calling a method on something that might be null. Add a check (or prevent that the relevant thing can ever be null in another way).
Simply do a proper check for the value being null. A conditional such as
if (value == null)
will never raise a NullRefePointerException. It's only if you try accessing whatever a null reference points to that you get the exception. So calling methods or accessing other instance members of the object is out of the question.
Use an if to check for the variable not being null and then use an else code block for when it is null.
if (variable != null)
{
// Code when object is not null
}
else
{
// Code when object is null
}
The null pointer is only thrown when you try and use the null value.
For example,
variable.method();
But you should always avoid a situation where a null pointer could occur.
As stated by other posters, if you do not expect the s reference to be null here then fix the bug that causes the reference to be null in the first place. However, if it is valid that the reference could be null, you can also do the following using the ternary operator (Java 5 on)
int len = (s == null) ? 0 : s.length;
Note: the brackets are optional, but they make it a bit more readable in my opinion.
It is a really confusing question, but:
boolean isNull = true;
if (value != null) {
isNull = false;
}

Categories