Alex Rivera | Logout

what is the exact order of execution for try, catch and finally?

Asked 2013-07-26T06:14:34.160
8

In this java code,

import java.io.IOException;

public class Copy
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java Copy srcFile dstFile");
         return;
      }

      int fileHandleSrc = 0;
      int fileHandleDst = 1;
      try
      {
         fileHandleSrc = open(args[0]);
         fileHandleDst = create(args[1]);
         copy(fileHandleSrc, fileHandleDst);
      }
      catch (IOException ioe)
      {
         System.err.println("I/O error: " + ioe.getMessage());
         return;
      }
      finally
      {
         close(fileHandleSrc);
         close(fileHandleDst);
      }
   }

   static int open(String filename)
   {
      return 1; // Assume that filename is mapped to integer.
   }

   static int create(String filename)
   {
      return 2; // Assume that filename is mapped to integer.
   }

   static void close(int fileHandle)
   {
      System.out.println("closing file: " + fileHandle);
   }

   static void copy(int fileHandleSrc, int fileHandleDst) throws IOException
   {
      System.out.println("copying file " + fileHandleSrc + " to file " +
                         fileHandleDst);
      if (Math.random() < 0.5)
         throw new IOException("unable to copy file");

      System.out.println("After exception");
   }
}

the output that I expect is

copying file 1 to file 2
I/O error: unable to copy file
closing file: 1
closing file: 2

However sometimes I get this expected output and at other times I get the following output:

copying file 1 to file 2
closing file: 1
closing file: 2
I/O error: unable to copy file  

and sometimes even this output:

I/O error: unable to copy file
copying file 1 to file 2
closing file: 1
closing file: 2

and whether I get the first, second or third output seems to happen randomly during every execu

Edit
Report

1 Answer

1

You have one glitch in your example which I would remove. You are writing to both System.out and System.err and expection your console to synchronize both streams correctly. To remove side effects I would just use one stream here.

answered 2013-07-26T06:19:05.913

Your Answer