I have this factory method in java:
public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
if (config == null) {
InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
config = new Properties();
config.load(in);
}
return config;
}
And I want to transform the two checked exceptions into unchecked exceptions. What is the best way to go about this?
Should I just catch the exception and throw a new RuntimeException using the caught exception as the inner exception?
Is there a better way to do this or should I even be attempting to do this in the first place?
EDIT:
Just to clarify. These exceptions will be fatal, as the configuration file is essentially to the operation of the program and all exception will be caught and logged at the top level of my program.
My purpose is to avoid an unnecessary throws exception, exception added to the signature of every method that calls my factory.
Here is a nice compilation of exception handling best practices.
Two points from there:
And you may throw the RuntimeException with or without inner exception, depending on what the caller can do with it. If you're not rethrowing the inner exception then you should log it in your method, if important.
A
RuntimeException
should be used only when the client cannot recover from whatever the problem is. It is occasionally appropriate to do what you are talking about, but more often it is not appropriate.If you are using a JDK >= 1.4, then you can do something like:
and the rethrown
RuntimeException
will have the original cause included inside it. This way, someone at the top of the thread catching theRuntimeException
-- your threads do catchRuntimeException
so they don't just silently die, right? -- can at least print out the FULL stack trace of the cause.But as others have said and will say, exceptions are checked for a reason. Only do this when you are positive that your clients cannot recover from the problem that you are rethrowing as an unchecked exception.
NOTE: Better than just
RuntimeException
would be to use a more specific unchecked exception if one is available. For example, if the only reason your method could throw aClassNotFoundException
is because a configuration file is missing, you could rethrow aMissingResourceException
, which is an unchecked exception but gives more information about why you are throwing it. Other goodRuntimeException
s to use if they describe the problem you are rethrowing areIllegalStateException
,TypeNotPresentException
andUnsupportedOperationException
.Also note that it is ALWAYS a good idea for your threads to catch RuntimeException and at a minimum log it. At least this way you understand why your threads are going away.
You are doing it the correct way.
In order to let checked exceptions pass though without being checked, you must wrap them in un-checked exceptions.
Just remember, Exceptions are checked for a reason.
If you want to avoid too many
try - catch
es, catch both the exceptions in the factory itself and handle them there. Perhaps return a default implementation.You have to handle the exceptions, here or somewhere else.
And since this is a factory, I think it is better that these exceptions are handled in the factory itself (same method or different method), and returning a default implementation.
Anyway, the (business function) caller will have no clue on what has to be done when it encounters a
ClassNotFoundException
.