jetbrick-commons/src/main/java/jetbrick/lang/StringUtils.java
public static String substring(final String s, int start, int end) {
        if (s == null) {
            return null;
        }

        // handle negatives
        if (end < 0) {
            end = s.length() + end; // remember end is negative
        }
        if (start < 0) {
            start = s.length() + start; // remember start is negative
        }

        // check length next
        if (end > s.length()) {
            end = s.length();
        }

        // if start is greater than end, return ""
        if (start > end) {
            return "";
        }

        if (start < 0) {
            start = 0;
        }
        if (end < 0) {
            end = 0;
        }

        return s.substring(start, end);
    }
public static String substring(final String s, int start, int end) {
        if (s == null) {
            return null;
        }

        // handle negatives
        if (end < 0) {
            end = s.length() + end; // remember end is negative
        }
        if (start < 0) {
            start = s.length() + start; // remember start is negative
        }

        // check length next
        if (end > s.length()) {
            end = s.length();
        }

        // if start is greater than end, return ""
        if (start > end) {
            return "";
        }

        if (start < 0) {
            start = 0;
        }
        if (end < 0) {
            end = 0;
        }

        return s.substring(start, end);
    }
public static String substring ( final String s , int start , int end ) { if ( s == null ) { return null ; } // handle negatives if ( end < 0 ) { end = s . length ( ) + end ; // remember end is negative } if ( start < 0 ) { start = s . length ( ) + start ; // remember start is negative } // check length next if ( end > s . length ( ) ) { end = s . length ( ) ; } // if start is greater than end, return "" if ( start > end ) { return "" ; } if ( start < 0 ) { start = 0 ; } if ( end < 0 ) { end = 0 ; } return s . substring ( start , end ) ; }
<p>
Gets a substring from the specified String avoiding exceptions.
</p>

<p>
A negative start position can be used to start/end {@code n} characters
from the end of the String.
</p>

<p>
The returned substring starts with the character in the {@code start}
position and ends before the {@code end} position. All position counting
is zero-based -- i.e., to start at the beginning of the string use
{@code start = 0}. Negative start and end positions can be used to
specify offsets relative to the end of the String.
</p>

<p>
If {@code start} is not strictly to the left of {@code end}, "" is
returned.
</p>

<pre>
StringUtils.substring(null, *, *)    = null
StringUtils.substring("", * ,  *)    = "";
StringUtils.substring("abc", 0, 2)   = "ab"
StringUtils.substring("abc", 2, 0)   = ""
StringUtils.substring("abc", 2, 4)   = "c"
StringUtils.substring("abc", 4, 6)   = ""
StringUtils.substring("abc", 2, 2)   = ""
StringUtils.substring("abc", -2, -1) = "b"
StringUtils.substring("abc", -4, 2)  = "ab"
</pre>
<p > Gets a substring from the specified String avoiding exceptions . < / p >