001// Copyright 2007 by Basil Vandegriend. All rights reserved. 002 003package com.basilv.examples.errorhandling; 004 005import static org.junit.Assert.*; 006import org.junit.Test; 007 008 009public class ReturnInFinallyBlockTest 010{ 011 012 @SuppressWarnings("finally") 013 boolean performBusinessOperation() { 014 boolean operationResult = false; 015 try { 016 017 // Perform some business logic... 018 operationResult = true; 019 020 } catch (IllegalStateException e) { 021 // Handle this exception.. 022 operationResult = false; 023 } catch (IllegalArgumentException e) { 024 // Handle this exception... 025 operationResult = false; 026 } finally { 027 // Common cleanup... 028 029 // Following line produces warning 030 // "Finally block does not complete normally" 031 return operationResult; 032 } 033 } 034 035 036 @SuppressWarnings("finally") 037 private boolean isReturnWithinFinally() { 038 try { 039 if (true) throw new RuntimeException(); 040 } finally { 041 return true; // This hides the exception 042 } 043 } 044 045 private boolean isReturnOutsideFinally() { 046 try { 047 if (true) throw new RuntimeException(); 048 } finally { 049 // Return outside finally block. 050 } 051 return true; 052 } 053 054 @Test 055 public void testReturnFromFinallyBlockWithUnhandledException() { 056 057 assertTrue(isReturnWithinFinally()); 058 try { 059 isReturnOutsideFinally(); 060 fail("Expect exception"); 061 } catch (RuntimeException e) { 062 // Expected case. 063 } 064 } 065 066}