Buggy code:
public final class Strings { private static final Pattern htmlNumber = Pattern . compile ( "\\&\\#\\d+\\;" ) ; private static final char [ ] hexDigit = new char [ ] { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' } ; public static final String LINE_SEPARATOR ; public static String afterFirst ( final String s , final char c ) { } public static String afterFirstPathComponent ( final String path , final char separator ) { } public static String afterLast ( final String s , final char c ) { } public static String beforeFirst ( final String s , final char c ) { } public static String beforeLast ( final String s , final char c ) { } public static String beforeLastPathComponent ( final String path , final char separator ) { } public static String capitalize ( final String s ) { } public static CharSequence escapeMarkup ( final String s ) { } public static CharSequence escapeMarkup ( final String s , final boolean escapeSpaces ) { } public static CharSequence escapeMarkup ( final String s , final boolean escapeSpaces , final boolean convertToHtmlUnicodeEscapes ) { } public static String replaceHtmlEscapeNumber ( String str ) { } public static String firstPathComponent ( final String path , final char separator ) { } public static boolean isEmpty ( final CharSequence string ) { } public static boolean isEqual ( final String string1 , final String string2 ) { } public static boolean isTrue ( final String s ) throws StringValueConversionException { } public static String lastPathComponent ( final String path , final char separator ) { } public static CharSequence replaceAll ( final CharSequence s , final CharSequence searchFor , CharSequence replaceWith ) { } public static String fromEscapedUnicode ( String escapedUnicodeString ) { } public static String toEscapedUnicode ( String unicodeString ) { } public static String [ ] split ( final String s , final char c ) { } public static String stripEnding ( final String s , final String ending ) { } public static Boolean toBoolean ( final String s ) throws StringValueConversionException { } public static char toChar ( final String s ) throws StringValueConversionException { } public static CharSequence toMultilineMarkup ( final CharSequence s ) { } public static String toString ( final Object object ) { } public static String toString ( final Throwable throwable ) { } private static void outputThrowable ( Throwable cause , AppendingStringBuffer sb , boolean stopAtWicketServlet ) { } private static char toHex ( int nibble ) { } private static void append ( AppendingStringBuffer buffer , CharSequence s , int from , int to ) { } private static int search ( final CharSequence s , String searchString , int pos ) { } public static String join ( String separator , String [ ] fragments ) { if ( ( fragments . length ) < 1 ) { return "" ; } else if ( ( fragments . length ) < 2 ) { return fragments [ 0 ] ; } else { <START_BUG> StringBuilder buff = new StringBuilder ( 128 ) ; <END_BUG> if ( ( fragments [ 0 ] ) != null ) { buff . append ( fragments [ 0 ] ) ; } for ( int i = 1 ; i < ( fragments . length ) ; i ++ ) { if ( ( ( fragments [ ( i - 1 ) ] ) != null ) || ( ( fragments [ i ] ) != null ) ) { boolean lhsClosed = fragments [ ( i - 1 ) ] . endsWith ( separator ) ; boolean rhsClosed = fragments [ i ] . startsWith ( separator ) ; if ( lhsClosed && rhsClosed ) { buff . append ( fragments [ i ] . substring ( 1 ) ) ; } else if ( ( ! lhsClosed ) && ( ! rhsClosed ) ) { buff . append ( separator ) . append ( fragments [ i ] ) ; } else { buff . append ( fragments [ i ] ) ; } } } return buff . toString ( ) ; } } private Strings ( ) { } }

Fix:
StringBuffer buff = new StringBuffer ( 128 ) ;