I am implementing a Java Project, and in the data access layer, I am using the function below:
public List<Error> readList(Predicate<Error> predicate) throws SQLException
It reads some Error list from the database according to criteria defined at the parameter predicate. Code of the Error is given below:
public class Error {
private int primaryKey;
private String definition;
private String placeTaken;
private boolean isSolved;
private Status status;
private String code;
private boolean canBeSeenByEndUser;
private int applicationKey;
public Error() {
// Assignments
}
// other constructors and functions
public String getPlaceTaken()
{
return this.placeTaken;
}
}
I have written some junit test for testing the readList function. The readList_xxx function tests the readList function according to different predicates. All predicates that are the subject of non-string attributes, such as primaryKey, isSolved and status are working well. However, when I used the predicates that are the subject of string attributes, such as placeTaken and definition I am getting NullPointerException at the initializeReadList_006. Here is the details:
private boolean initializeReadList_006() {
// the stacktrace points the error point here
Predicate<Error> currentPredicate = p-> p.getPlaceTaken().equals("PLACETAKEN3");
return (currentPredicate != null);
}
@Test
public void readList_006() {
try {
assertEquals(true, initializeReadList_006());
errorList = errorDataAccessLayer.readList(currentPredicate);
isEmpty = ListAffairs.isEmpty(errorList);
isZero = ListAffairs.isNumberofElementsZero(errorList);
assertEquals(false,isEmpty);
assertEquals(false,isZero);
int size = errorList.size();
assertEquals(1, size);
} catch (Exception exception) {
fail(exception.getMessage());
} catch (SQLException sqlException) {
fail(sqlException.getMessage());
}
}
When I debug the function readList, I am getting exception at the specified point. This function connects to database, reads the error list at the database and filters the errors according to predicate.
@Override
public List<Error> readList(Predicate<Error> predicate) throws SQLException {
try
{
List<Error> errorList = new ArrayList<Error>();
Creator creator = this.getPreparedStatementCreator();
Connection connection = null;
List<Error> databaseList = new ArrayList<Error>();
if(predicate == null)
throw new ArgumentNullException(MessageAffairs.<Predicate>getEmptyInstanceMessage(Predicate.class));
if(StringAffairs.isEmpty(this.schemaName))
throw new RuntimeException(MessageAffairs.<String>getEmptyInstanceMessage(String.class));
if(StringAffairs.isEmpty(this.tableName))
throw new RuntimeException(MessageAffairs.<String>getEmptyInstanceMessage(String.class));
this.databaseColumnList = this.createDatabaseColumnList();
if(ArrayAffairs.isNumberofElementsZero(this.databaseColumnList))
throw new RuntimeException();
try
{
connection = this.getDatabaseConnection();
} catch (ClassNotFoundException classNotFoundException) {
throw this.creator.createRuntimeException(classNotFoundException);
}
if(connection == null) {
throw new RuntimeException();
}
PreparedStatement statement = null;
try
{
statement = creator.createSelectPredicate(connection, this.schemaName, this.tableName);
}catch(ArgumentNullException argumentNullException) {
return databaseList;
}
catch (FailedActionError failedActionError) {
return databaseList;
}
if(statement == null)
{
return databaseList;
}
ResultSet result = statement.executeQuery();
if(result == null)
return databaseList;
databaseList = creator.createErrorList(result,this.databaseColumnList);
connection.close();
if(ListAffairs.isEmpty(databaseList))
throw new RuntimeException();
if(ListAffairs.isNumberofElementsZero(databaseList))
return databaseList;
//the point that I am getting error
errorList = databaseList.stream()
.filter( predicate )
.collect(Collectors.<Error>toList());
return errorList;
} catch (RuntimeException runtimeException) {
throw runtimeException;
}
catch (SQLException sqlException) {
throw sqlException;
}
}
What I am doing wrong? Thanks in advance.
EDIT 1: This question is different from the classical NullPointerException. This question covers a technical affair related to Predicates.
EDIT 2: I think sigur's answer below is the right answer:
If you're getting a NullPointer inside your predicate, it means inside your list there's at least one null value. Something like: arrayList.add(null)