title: Java: Exceptions as control flow?
body: <p>I've heard that using exceptions for control flow is bad practice. What do you think of this?</p>
  
  <pre><code>public static findStringMatch(g0, g1) {
  
      int g0Left = -1;
      int g0Right = -1;
      int g1Left = -1;
      int g1Right = -1;
  
  //if a match is found, set the above ints to the proper indices
  //...
  //if not, the ints remain -1
  
          try {
              String gL0 = g0.substring(0, g0Left);
              String gL1 = g1.substring(0, g1Left);
  
              String g0match = g0.substring(g0Left, g0Right);
              String g1match = g1.substring(g1Left, g1Right);
  
              String gR0 = g0.substring(g0Right);
              String gR1 = g1.substring(g1Right);
  
              return new StringMatch(gL0, gR0, g0match, g1match, gL1, gR1);
          }
          catch (StringIndexOutOfBoundsException e) {
              return new StringMatch(); //no match found
          }
  </code></pre>
  
  <p>So, if no match has been found, the ints will be -1. This will cause an exception when I try to take the substring <code>g0.substring(0, -1)</code>. Then the function just returns an object indicating that no match is found.</p>
  
  <p>Is this bad practice? I could just check each index manually to see if they're all -1, but that feels like more work.</p>
  
  <p><strong>UPDATE</strong></p>
  
  <p>I have removed the try-catch block and replaced it with this:</p>
  
  <pre><code>    if (g0Left == -1 || g0Right == -1 || g1Left == -1 || g1Right == -1) {
          return new StringMatch();
      }
  </code></pre>
  
  <p>Which is better: checking if each variable is -1, or using a boolean <code>foundMatch</code> to keep track and just check that at the end?</p>