Q:

NullPointerException for if(line[waitingLine].isEmpty()) --emptyLines;

public class ObjQueue<E> extends Vector<E>
{...}

ObjQueue<Customer>[] line=new ObjQueue[numServices];
...
if(line[waitingLine].isEmpty()) --emptyLines;

NullPointerException is for if(line[waitingLine].isEmpty()) --emptyLines; What's wrong?

A:

This is most likely because line[waitingLine] is null, so you cannot call isEmpty on an null object. Your code to check should look like below:
...
if(line[waitingLine] != null && line[waitingLine].isEmpty())
...

I am assuming that the ... in your sample code means that you are placing values into the line array. However, if that is not the case, then you must fill those values in. When you instantiate an array, it merely allocates the space for the array. All of the array slots will essentially be filled with null until explicitly set.
Example code to fill in the waitingLine slot of line:
line[waitingLine] = new objQueue<Customer>();

You can explicitly fill ALL slots be creating a loop and placing the queue objects in each one.
However, if you want something that grows/shrinks dynamically, then you probably want to create a List instead.

A:

This:
new objQueue[numServices];

creates an array with all of its elements set to null — not an array of empty queues. So this:
line[waitingLine].isEmpty()

will invoke isEmpty() on null, unless you've explicitly initialized the elements of line in some way.
You probably want to follow this:
objQueue<Customer> [] line=new objQueue[numServices];

with this:
for(int i = 0; i < numServices; ++i)
    line[i] = new objQueue<Customer>();

to initialize each element to a new, distinct queue.

