Why use finally instead of code after catch [duplicate] - java

This question already has answers here:
Why do we use finally blocks? [duplicate]
(11 answers)
Closed 5 years ago.
Why do this
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
cs.close();
rs.close();
}
Instead of this
} catch (SQLException sqle) {
sqle.printStackTrace();
}
rs.close();
cs.close();

Because if an exception gets thrown no code after the try block is executed unless the exception is caught. A finally block is always executed no matter what happens inside your try block.

Look at your catch block - it's going to throw DAOException. So the statements after your catch block aren't going to be executed even in the sample you've given. What you've shown (wrapping one exception in another) is one common pattern - but another possibility is that the catch block "accidentally" throws an exception, e.g. because one of the calls it makes fails.
Additionally, there may be other exceptions you don't catch - either because you've declared that the method throws them, or because they're unchecked exceptions. Do you really want to leak resources because an IllegalArgumentException got thrown somewhere?

Because if an exception is thrown,
Code in the finally clause will execute as the exception propagates outward, even if the exception aborts the rest of the method execution;
Code after the try/catch block will not get executed unless the exception is caught by a catch block and not rethrown.

According to HeadFirst Java, a finally block will run even if the try or catch block has a return statement. Flow jumps to finally and then back to return.

Because it ensures that the stuff in the finally block gets executed. Stuff after catch might not get executed, say, for example, there is another exception in the catch block, which is very possible. Or you just do what you did, and throw an exception wrapping the original exception.

The finally keyword guarantees that the code is executed. In your bottom example, the close statements are NOT executed. In the top example, they are executed (what you want!)

Your second approach won't do the 'close' statements because it is already left the method.

This is the way to avoid resource leaks

If you catch all errors, there should no difference, otherwise, only code inside finally block is executed because the code execution sequence is:
finally code -> error throw -> code after catch
hence, once your code throw any unhandled error, only finally code block works as expected.

The code in the finally block will get called before the exception is rethrown from the catch block. This ensures that any cleanup code that you've put in the finally block gets called. Code outside of the finally block will not be run.

this might clarify: http://www.java2s.com/Code/Java/Language-Basics/Finallyisalwaysexecuted.htm

consider the catch can throw an exception to the higher level functions in the call stack. This will lead calling final before throwing the exception to the upper level.

In http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html this is misleading (and may have originated the question):
The try block of the writeList method that you've been working with here opens a PrintWriter. The program should close that stream before exiting the writeList method. This poses a somewhat complicated problem because writeList's try block can exit in one of three ways.
1. The new FileWriter statement fails and throws an IOException.
2. The list.get(i) statement fails and throws an IndexOutOfBoundsException.
3. Everything succeeds and the try block exits normally.
The 4th way (an exception other than IOException and IndexOutOfBoundsException is thrown) is missing. The code depicted in the preceding page only catches (1) and (2) before resorting to finally.
I'm also new to Java and had the same questioning before finding this article. Latent memory tend to attach itself more to examples than to theory, in general.

The finally block may not always run, consider the following code.
public class Tester {
public static void main(String[] args) {
try {
System.out.println("The main method has run");
System.exit(1);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("The finally block has run");
}
}
}
In your case, I would suggest to wrap the code inside finally block into try/catch, as this code apparently may throw an exception.
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
try {
cs.close();
rs.close();
} catch (Exception e) {
//handle new exception here
}

Related

Nested try blocks with catches after finally

I want to write a code like this:
try {
try {
someStuffThatCausesBusinessExceptions();
} finally {
try {
cleanUp();
} catch (Exception e) {
// I don't really care
}
}
} catch (BusinessLogicException e) {
// work with exception
// cleaning up must be done by that point (or at least tried to)
}
Will exceptions from business logic survive the possible hiatus during cleanUp? Is there a better way to ignore all the possible exceptions from cleanUp?
A catch block will only catch Throwables that were thrown in its corresponding try block. Thus, your exceptions thrown in the surrounding try block will be preserved and caught in the outer catch block.
Yes. Your exception will reach the last catch. However, this structure seems weird an non-idiomatic to me, i guess i would even prefer having cleanUp() more than once in that code over having 3 tries.
There are two cases-:
1. if excetpion occurs from mehtod someStuffThatCausesBusinessExceptions only then it will be caught in your outer catch block.
2. if the methods someStuffThatCausesBusinessExceptions and cleanUp both throw exceptions then the exception thrown from try block is suppressed.
Yes!! there is better way.You can use try-with-resources statement.
Please refere to this link.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Use of finally in java [duplicate]

This question already has answers here:
Why do we use finally blocks? [duplicate]
(11 answers)
Closed 5 years ago.
Consider the code
try{
//code
} catch(Exception e) {
// handle
} finally {
// close open connections
}
and this
try{
//code
} catch(Exception e) {
// handle
}
// close open connections
since both are same what is the necessity of finally block?
The finally block will always be executed, even if you don't catch all the exceptions thrown by the try block in the catch block, or if the catch block throws a new exception.
In the second snippet, the code following the try-catch block won't be executed if either the try or catch blocks throw exceptions not caught by the catch block.
A finally block is much safer, as it's guaranteed to execute even if your try block throws an exception that isn't handled by the catch block or returns.
It also has the side effect of organizing all the "cleanup" code in an expected location, making the code (arguably) easier to maintain.
It's worth noting, by the way, that if you're using Java 7 or higher, and the resource you're handling is an AutoCloseable (such as a java.sql.Connection, for example), there's an even cleaner solution - the try-with-resource syntax, which saves you the hassle of explicitly closing the resource:
try (Connection con = /* something */) {
// code
} catch (SomeException e) {
// handle
// If there's nothing intelligent to do, this entire clause can be omitted.
}
finally block is used to execute important code such as closing connection, stream etc. finally block in java can be used to put "cleanup" code such as closing a file, closing connection etc.
Java finally block is always executed whether exception is handled or not.
For each try block there can be zero or more catch blocks, but only one finally block.
The finally block will not be executed if program exits(either by calling System.exit() or by causing a fatal error that causes the process to abort).

return statement - finally block does not complete normally [duplicate]

This question already has answers here:
Behaviour of return statement in catch and finally
(8 answers)
Closed 8 years ago.
Similar question has been asked here. But that does not provide answer.
try {
object = (Dev)Class.forName("Dev").newInstance();
} catch (Exception e)
{
throw new RuntimeException("Devis not available");
}
finally
{
return object;
}
But finally block gives warning :
finally block does not complete normally
But as per my understating, finally block always gets executed and will return the object. Why warning says that it will not get completed normally?
The problem is that the finally block would remove any exceptions being thrown since it would issue a "normal" return.
From the JLS spec:
Abrupt completion of a finally clause can disrupt the transfer of control initiated by a return statement.
and (more relevant in your case):
Note that abrupt completion of a finally clause can disrupt the transfer of control initiated by a throw statement.
There are so many explanations about the finally block in a try-catch-finally statement. Go and search for it.
Quick explanation anyway: The finally block is always run, regardless whether an exception was thrown (and maybe caught) or not. If a finally block terminates in an unnormal way (such as itself throwing an excpetion or returning a value) this will always override what was done in the try block or a catch block. That also means that these are got lost.
The conclusion: Never throw an exception ot return a value from the finally block. Only use it for cleaning up processes.
try this. If you are throwing an exception than there is something wrong with object. just return it before the catch.
try {
object = (Dev)Class.forName("Dev").newInstance();
return object;
} catch (Exception e)
{
throw new RuntimeException("Devis not available");
}
Returning from finally is a bad practice in java.
It may result in many unexpected outputs. Check below link for some of such examples:
http://www.cs.arizona.edu/projects/sumatra/hallofshame/
Anyways found few links related to this finally block, Follow the below links for answers related to that.
Does finally always execute in Java?
Returning from a finally block in Java

How do you continue your program even if an exception occurs?

In my program I have to constantly access the hard drive thousands of times to view images (no way around it), occasionally my program gets tripped up on a "file not found IO Exception" most likely because of the many modifications I'm making to the images and re saving quickly. How do I continue my program even if this error occurs, because currently it causes my program to stop?
Code:
filepattern=imageLocation+temp+"image.jpg";
File outputfile = new File(filepattern);
BufferedImage img = null;
try {
img = ImageIO.read(outputfile);
} catch (IOException e) {
}
Note: I have fixed the problem by making sure the file exists first. Thanks for all your help!
Catch the exception and handle it as needed.
try {
// your code
} catch (<Expected exception> e) {
// handle the exception
}
Surround the statement with a try catch.
This will stop the code from crashing and in the catch block you can write code to deal with the failure.
There are 3 key words
try {}
executes the block that can cause problems
catch (Exception ex) {}
executes code to handle specific exceptions. Instead of Exception you can handle specific exception types
finally {}
executes cleanup code. Even if exception occurs and breaks the execution flow in try block, this code will always execute.
You might try something like the fragment below. Of course, you will want to encapsulate the actual reading in a try / catch / finally block to make sure you close the file
try {
filesTried++;
[you code]
} catch (IOException e) {
fileErrors++;

In Java, can a single Catch Block be shared by multiple Try Blocks?

I am working on a java program that will be constructed by multiple methods, each with it's own try/catch blocks. I find myself duplicating the same catch block in each try block.
Is there any way to have multiple try blocks use a single catch block?
Thanks
put the shared logic in a common method and invoke it from each catch block.
try {
try (BufferedReader autoClosable1 = new BufferedReader(new FileReader(new File("")))) {
}
try (BufferedReader autoClosable2 = new BufferedReader(new FileReader(new File("")))) {
}
} catch (Exception e) {
e.printStackTrace();
}
//try it in java 7 onwards..
I don't believe you can have multiple try declarations going off of one catch, but depending on the situation, you probably don't need it.
If the code you're writing throws the same exception, then it can all be handled in one try...catch statement. Place all dodgy code within the try block and handle the exception that comes through.
If the code you're writing throws different exceptions, then with Java 7, you can catch multiple exceptions within one catch block. You'd still place the dodgy code in the one try block.
No you can not do that. You have to have at least one catch block or a finally block in order the try block to be compiled. Since the finally block is anyway going to be executed no matter exception occurred or not you have to have catch block in case to handle the exception occurred. As the jtah says you can have a common method to be executed in each catch block.

Categories

Resources