Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I check if argument is null if I'm going to use it immediately?

I'm so used to check if a method's argument is null (then proceed to throw an exception) that I almost don't even think about it anymore. If the argument is a reference type, it's there:

if(arg == null)
    throw new ArgumentNullException(nameof(arg));

But what if I'm going to use arg immediately? Should I check anyway? I mean, if I don't, the envinroment will throw for me (a NullReferenceException) anyway.

For instance:

public int DoStuff(object o)
{
    return o.GetHashCode();
}

I could write add the null check easily:

public int DoStuff(object o)
{
    if(o == null)
        throw new ArgumentNullException(nameof(o));
    return o.GetHashCode();
}

But in both cases a exception will be thrown (in almost the exact same line, for debugging purpose). The only difference is the type.

The question: On public methods with a single reference type argument, if I'm going to use the argument immediately, should I still check it if it's null?

like image 547
Trauer Avatar asked Mar 09 '16 13:03

Trauer


People also ask

Should I always check for null?

In any case, it is always good practice to CHECK for nulls on ANY parameters passed in before you attempt to operate on them, so you don't get NullPointerExceptions when someone passes you bad data. Show activity on this post. If you don't know whether you should do it, the chances are, you don't need to do it.

Why checking for null is a good practice?

It is a good idea to check for null explicitly because: You can catch the error earlier. You can provide a more descriptive error message.

How do you handle an argument null exception?

To prevent the error, instantiate the object. An object returned from a method call is then passed as an argument to a second method, but the value of the original returned object is null . To prevent the error, check for a return value that is null and call the second method only if the return value is not null .

How do you know if an argument is undefined?

To check if a parameter is provided to a function, use the typeof operator to check if the parameter is not equal to the string "undefined" , e.g. if (typeof param !== 'undefined') . If the condition is met, the parameter was provided to the function.


1 Answers

I suggest checking, because you have two Exception types:

  1. Unexpected NullReferenceException - something went wrong, and you have to debug your own routine
  2. ArgumentNullException - the argument is null, and it's caller that's wrong (and not your code which reacts right)

throwing ArgumentNullException is kind of contract: I'll do the thing in case argument is correct:

  // An exaggerated example 
  public int DoStuff(SomeObject o) {
    if (o == null)
      throw new ArgumentNullException(nameof(o));
    else if (o.Disposed)
      throw new ArgumentException(nameof(o), "o must not be disposed")  
    else if (o.Id > 100)
      throw new ArgumentOutOfRangeException("Id ...", nameof(o));  

    // o meets the contract, we accept it and thus we guarantee the output

    return o.SomeMethod();
  }

This kind of validation is typical for public (protected) methods since they're exposed to outer world and can face any argument; however, in case of private method you can omit the contract: any caller is within the class that implements the method.

like image 72
Dmitry Bychenko Avatar answered Oct 03 '22 08:10

Dmitry Bychenko