Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6755645
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T13:25:40+00:00 2026-05-26T13:25:40+00:00

I’m trying to understand how the new try-with-resources statement works by recreating it using

  • 0

I’m trying to understand how the new try-with-resources statement works by recreating it using regular try-catch-finally statements. Given the following test class using Java 7 try-with-resources:

import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class TryWithResources {
    public static void main(String[] args) {
        try (GZIPOutputStream gzip = new GZIPOutputStream(System.out)) {
            gzip.write("TEST".getBytes("UTF-8"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

How would you rewrite this class to use try-catch-finally statements which produces exactly the same bytecode as the try-with-resources statement produces? Also, same question when two resources are used, as in the following example:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class TryWithResources2 {
    public static void main(String[] args) {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
                GZIPOutputStream gzip = new GZIPOutputStream(baos)) {
            gzip.write("TEST".getBytes("UTF-8"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T13:25:41+00:00Added an answer on May 26, 2026 at 1:25 pm

    For the TryWithResources class, the following class produces equivalent bytecode as the try-with-resources:

    import java.io.IOException;
    import java.util.zip.GZIPOutputStream;
    
    public class TryCatchFinally {
        public static void main(String[] args) {
            try {
                final GZIPOutputStream gzip = new GZIPOutputStream(System.out);
                Throwable gzipEx = null;
                try {
                    gzip.write("TEST".getBytes("UTF-8"));
                } catch (Throwable t) {
                    gzipEx = t;
                    throw t;
                } finally {
                    if (gzip != null) {
                        if (gzipEx != null) {
                            try {
                                gzip.close();
                            } catch (Throwable t) {
                                gzipEx.addSuppressed(t);
                            }
                        } else {
                            gzip.close();
                        }
                    }
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
    

    Using Sun JDK 1.7.0, the bytecode and exception tables for the main method in both TryWithResources and TryCatchFinally classes is:

      stack=3, locals=6, args_size=1
         0: new           #2                  // class java/util/zip/GZIPOutputStream
         3: dup           
         4: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         7: invokespecial #4                  // Method java/util/zip/GZIPOutputStream."<init>":(Ljava/io/OutputStream;)V
        10: astore_1      
        11: aconst_null   
        12: astore_2      
        13: aload_1       
        14: ldc           #5                  // String TEST
        16: ldc           #6                  // String UTF-8
        18: invokevirtual #7                  // Method java/lang/String.getBytes:(Ljava/lang/String;)[B
        21: invokevirtual #8                  // Method java/util/zip/GZIPOutputStream.write:([B)V
        24: aload_1       
        25: ifnull        95
        28: aload_2       
        29: ifnull        48
        32: aload_1       
        33: invokevirtual #9                  // Method java/util/zip/GZIPOutputStream.close:()V
        36: goto          95
        39: astore_3      
        40: aload_2       
        41: aload_3       
        42: invokevirtual #11                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
        45: goto          95
        48: aload_1       
        49: invokevirtual #9                  // Method java/util/zip/GZIPOutputStream.close:()V
        52: goto          95
        55: astore_3      
        56: aload_3       
        57: astore_2      
        58: aload_3       
        59: athrow        
        60: astore        4
        62: aload_1       
        63: ifnull        92
        66: aload_2       
        67: ifnull        88
        70: aload_1       
        71: invokevirtual #9                  // Method java/util/zip/GZIPOutputStream.close:()V
        74: goto          92
        77: astore        5
        79: aload_2       
        80: aload         5
        82: invokevirtual #11                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
        85: goto          92
        88: aload_1       
        89: invokevirtual #9                  // Method java/util/zip/GZIPOutputStream.close:()V
        92: aload         4
        94: athrow        
        95: goto          103
        98: astore_1      
        99: aload_1       
       100: invokevirtual #13                 // Method java/io/IOException.printStackTrace:()V
       103: return        
      Exception table:
         from    to  target type
            32    36    39   Class java/lang/Throwable
            13    24    55   Class java/lang/Throwable
            13    24    60   any
            70    74    77   Class java/lang/Throwable
            55    62    60   any
             0    95    98   Class java/io/IOException
    

    For the TryWithResources2 class, the following class produces equivalent bytecode as the try-with-resources:

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.zip.GZIPOutputStream;
    
    public class TryCatchFinally2 {
        public static void main(String[] args) {
            try {
                final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                Throwable baosEx = null;
                try {
                    final GZIPOutputStream gzip = new GZIPOutputStream(baos);
                    Throwable gzipEx = null;
                    try {
                        gzip.write("TEST".getBytes("UTF-8"));
                    } catch (Throwable t) {
                        gzipEx = t;
                        throw t;
                    } finally {
                        if (gzip != null) {
                            if (gzipEx != null) {
                                try {
                                    gzip.close();
                                } catch (Throwable t) {
                                    gzipEx.addSuppressed(t);
                                }
                            } else {
                                gzip.close();
                            }
                        }
                    }
                } catch (Throwable t) {
                    baosEx = t;
                    throw t;
                } finally {
                    if (baos != null) {
                        if (baosEx != null) {
                            try {
                                baos.close();
                            } catch (Throwable t) {
                                baosEx.addSuppressed(t);
                            }
                        } else {
                            baos.close();
                        }
                    }
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
    

    The bytecode and exception tables for the main method in both TryWithResources2 and TryCatchFinally2 classes is:

      stack=3, locals=10, args_size=1
         0: new           #2                  // class java/io/ByteArrayOutputStream
         3: dup           
         4: invokespecial #3                  // Method java/io/ByteArrayOutputStream."<init>":()V
         7: astore_1      
         8: aconst_null   
         9: astore_2      
        10: new           #4                  // class java/util/zip/GZIPOutputStream
        13: dup           
        14: aload_1       
        15: invokespecial #5                  // Method java/util/zip/GZIPOutputStream."<init>":(Ljava/io/OutputStream;)V
        18: astore_3      
        19: aconst_null   
        20: astore        4
        22: aload_3       
        23: ldc           #6                  // String TEST
        25: ldc           #7                  // String UTF-8
        27: invokevirtual #8                  // Method java/lang/String.getBytes:(Ljava/lang/String;)[B
        30: invokevirtual #9                  // Method java/util/zip/GZIPOutputStream.write:([B)V
        33: aload_3       
        34: ifnull        114
        37: aload         4
        39: ifnull        61
        42: aload_3       
        43: invokevirtual #10                 // Method java/util/zip/GZIPOutputStream.close:()V
        46: goto          114
        49: astore        5
        51: aload         4
        53: aload         5
        55: invokevirtual #12                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
        58: goto          114
        61: aload_3       
        62: invokevirtual #10                 // Method java/util/zip/GZIPOutputStream.close:()V
        65: goto          114
        68: astore        5
        70: aload         5
        72: astore        4
        74: aload         5
        76: athrow        
        77: astore        6
        79: aload_3       
        80: ifnull        111
        83: aload         4
        85: ifnull        107
        88: aload_3       
        89: invokevirtual #10                 // Method java/util/zip/GZIPOutputStream.close:()V
        92: goto          111
        95: astore        7
        97: aload         4
        99: aload         7
       101: invokevirtual #12                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
       104: goto          111
       107: aload_3       
       108: invokevirtual #10                 // Method java/util/zip/GZIPOutputStream.close:()V
       111: aload         6
       113: athrow        
       114: aload_1       
       115: ifnull        185
       118: aload_2       
       119: ifnull        138
       122: aload_1       
       123: invokevirtual #13                 // Method java/io/ByteArrayOutputStream.close:()V
       126: goto          185
       129: astore_3      
       130: aload_2       
       131: aload_3       
       132: invokevirtual #12                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
       135: goto          185
       138: aload_1       
       139: invokevirtual #13                 // Method java/io/ByteArrayOutputStream.close:()V
       142: goto          185
       145: astore_3      
       146: aload_3       
       147: astore_2      
       148: aload_3       
       149: athrow        
       150: astore        8
       152: aload_1       
       153: ifnull        182
       156: aload_2       
       157: ifnull        178
       160: aload_1       
       161: invokevirtual #13                 // Method java/io/ByteArrayOutputStream.close:()V
       164: goto          182
       167: astore        9
       169: aload_2       
       170: aload         9
       172: invokevirtual #12                 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
       175: goto          182
       178: aload_1       
       179: invokevirtual #13                 // Method java/io/ByteArrayOutputStream.close:()V
       182: aload         8
       184: athrow        
       185: goto          193
       188: astore_1      
       189: aload_1       
       190: invokevirtual #15                 // Method java/io/IOException.printStackTrace:()V
       193: return        
      Exception table:
         from    to  target type
            42    46    49   Class java/lang/Throwable
            22    33    68   Class java/lang/Throwable
            22    33    77   any
            88    92    95   Class java/lang/Throwable
            68    79    77   any
           122   126   129   Class java/lang/Throwable
            10   114   145   Class java/lang/Throwable
            10   114   150   any
           160   164   167   Class java/lang/Throwable
           145   152   150   any
             0   185   188   Class java/io/IOException
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am trying to understand how to use SyndicationItem to display feed which is
I'm new to using the Perl treebuilder module for HTML parsing and can't figure
I'm trying to create an if statement in PHP that prevents a single post
Basically, what I'm trying to create is a page of div tags, each has
link Im having trouble converting the html entites into html characters, (&# 8217;) i
That's pretty much it. I'm using Nokogiri to scrape a web page what has
I want use html5's new tag to play a wav file (currently only supported
I'm using v2.0 of ClassTextile.php, with the following call: $testimonial_text = $textile->TextileRestricted($_POST['testimonial']); ... and
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this
We're building an app, our first using Rails 3, and we're having to build

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.