Re: Checking for null parameter
On Jun 11, 4:07 pm, Lew <con...@lewscanon.com.invalid> wrote:
pek wrote:
OK... Let me take you back to what was the meaning of this whole
discussion because I believe that the thing is going out of hand. The
discussion was about CHECKING a null reference, not HANDLING. Here is
an example:
public class ChatExample {
private Connection conn;
public ChatExample() {
// I intentionally forget to instantiate the conn
}
public void connect() throws ConnectionException {
try {
conn.connect();
} catch (ConnectionExcetpion e) {
// Delegate the exception
throw new ConnectionException("Connection failed in Chat",e)=
;
}
}
public sendMessage(String message) throws ConnectionException {
try {
conn.sendMessage(message);
} catch (ConnectionException e) {
// Delegate the exception
throw new ConnectionException("Couldn't send message in
Chat",e);
}
}
class Connection {
public void connect() throws ConnectionException {
// Do socket connection etc. etc.
}
public void sendMessage(String message) throws ConnectionExcepti=
on
{
// Send the message using sockets etc. etc.
}
}
}
public class Main {
public static void Main() {
// Catch and log any exceptions that wheren't planned without
crashing
try {
startProgram();
} catch (NullPointerException e) {
// Log it and inform user
} catch (Exception e) {
// Same here (probably combining with the above exception
wouldn't have any difference
}
}
private void startProgram {
// Do anything
// At some point you want to send a message
ChatExcample chat = new ChatExample();
chat.sendMessage("Hello world");
}
}
OK, now, did you notice that I forgot to instantiate the conn
attribute? That is a bug, which means that the user can NEVER send a
message simply because it is a NPE and it will stay that way no matter
what.
For this sort of thing, use 'assert':
public class ChatExample {
private final Connection conn; // final added
public ChatExample() {
// I intentionally forget to instantiate the conn
assert conn != null;
}
public void connect() throws ConnectionException {
assert conn != null;
try {
conn.connect();
} catch (ConnectionExcetpion e) {
// Delegate the exception
throw new ConnectionException("Connection failed in Chat",=
e);
}
}
public sendMessage(String message) throws ConnectionException {
assert conn != null;
try {
conn.sendMessage(message);
} catch (ConnectionException e) {
// Delegate the exception
throw new ConnectionException("Couldn't send message in
Chat",e);
}
}
We assume some appropriate mechanism for invoking conn.close(), not shown =
here.
Now it is impossible to throw NPE. Problem solved.
As for rethrowing the ConnectionException, that is controversial. At so=
me
point you should recover to correct program state instead of propagating t=
he
exception. Also, in real life of course one would log the ConnectionExc=
eption.
--
Lew
Also, by what I see, you changed your code from
if ( conn == null ) {
handleIt();
} else {
conn.connect();
}
to
assert conn != null
WHICH IS STILL CHECKING FOR NULL!