Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should functions return null or an empty object?

People also ask

Is it better to return null or empty values from functions methods where the return value is not present?

Regardless of whether or not NULL or an empty Person Object ( new Person() ) is returned the caller is going to have to check to see if the Person Object is NULL or empty before doing anything to it (like calling UpdateName() ). So why not just return NULL here and then the caller only has to check for NULL.

Should functions return null?

If your function is usually returns something but doesn't for some reason, return null; is the way to go. That's similar to how you do it e.g. in C: If your function doesn't return things, it's void , otherwise it often return either a valid pointer or NULL.

Is Empty object same as null?

The thing about null is that it doesn't come with meaning. It is merely the absence of an object. So, if you really mean an empty string/collection/whatever, always return the relevant object and never null . If the language in question allows you to specify that, do so.

What should I return instead of null?

you can usually simply return an empty object instead of null , and it will work fine, without special handling. In these cases, there's usually no need for the caller to explicitly handle the empty case.


Returning null is usually the best idea if you intend to indicate that no data is available.

An empty object implies data has been returned, whereas returning null clearly indicates that nothing has been returned.

Additionally, returning a null will result in a null exception if you attempt to access members in the object, which can be useful for highlighting buggy code - attempting to access a member of nothing makes no sense. Accessing members of an empty object will not fail meaning bugs can go undiscovered.


It depends on what makes the most sense for your case.

Does it make sense to return null, e.g. "no such user exists"?

Or does it make sense to create a default user? This makes the most sense when you can safely assume that if a user DOESN'T exist, the calling code intends for one to exist when they ask for it.

Or does it make sense to throw an exception (a la "FileNotFound") if the calling code is demanding a user with an invalid ID?

However - from a separation of concerns/SRP standpoint, the first two are more correct. And technically the first is the most correct (but only by a hair) - GetUserById should only be responsible for one thing - getting the user. Handling its own "user does not exist" case by returning something else could be a violation of SRP. Separating into a different check - bool DoesUserExist(id) would be appropriate if you do choose to throw an exception.

Based on extensive comments below: if this is an API-level design question, this method could be analogous to "OpenFile" or "ReadEntireFile". We are "opening" a user from some repository and hydrating the object from the resultant data. An exception could be appropriate in this case. It might not be, but it could be.

All approaches are acceptable - it just depends, based on the larger context of the API/application.


Personally, I use NULL. It makes clear that there is no data to return. But there are cases when a Null Object may be usefull.


If your return type is an array then return an empty array otherwise return null.


You should throw an exception (only) if a specific contract is broken.
In your specific example, asking for a UserEntity based on a known Id, it would depend on the fact if missing (deleted) users are an expected case. If so, then return null but if it is not an expected case then throw an exception.
Note that if the function was called UserEntity GetUserByName(string name) it would probably not throw but return null. In both cases returning an empty UserEntity would be unhelpful.

For strings, arrays and collections the situation is usually different. I remember some guideline form MS that methods should accept null as an 'empty' list but return collections of zero-length rather than null. The same for strings. Note that you can declare empty arrays: int[] arr = new int[0];


This is a business question, dependent on whether the existence of a user with a specific Guid Id is an expected normal use case for this function, or is it an anomaly that will prevent the application from successfully completing whatever function this method is providing the user object to...

If it's an "exception", in that the absence of a user with that Id will prevent the application from successfully completing whatever function it is doing, (Say we're creating an invoice for a customer we've shipped product to...), then this situation should throw an ArgumentException (or some other custom exception).

If a missing user is ok, (one of the potential normal outcomes of calling this function) then return a null....

EDIT: (to address comment from Adam in another answer)

If the application contains multiple business processes, one or more of which require a User in order to complete successfully, and one or more of which can complete successfully without a user, then the exception should be thrown further up the call stack, closer to where the business processes which require a User are calling this thread of execution. Methods between this method and that point (where the exception is being thrown) should just communicate that no user exists (null, boolean, whatever - this is an implementation detail).

But if all processes within the application require a user, I would still throw the exception in this method...


I personally would return null, because that is how I would expect the DAL/Repository layer to act.

If it doesn't exist, don't return anything that could be construed as successfully fetching an object, null works beautifully here.

The most important thing is to be consistant across your DAL/Repos Layer, that way you don't get confused on how to use it.