Buggy code:
public class BatchImageBuilder extends AbstractImageBuilder { protected BatchImageBuilder ( JavaBuilder javaBuilder ) { } public void build ( ) { } protected void addAllSourceFiles ( final ArrayList sourceFiles ) throws CoreException { } protected void cleanOutputFolders ( boolean copyBack ) throws CoreException { boolean deleteAll = JavaCore . CLEAN . equals ( javaBuilder . javaProject . getOption ( JavaCore . CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER , true ) ) ; if ( deleteAll ) { if ( ( this . javaBuilder . participants ) != null ) <START_BUG> for ( int i = this . javaBuilder . participants . length ; ( -- i ) >= 0 ; ) <END_BUG> this . javaBuilder . participants [ i ] . cleanStarting ( this . javaBuilder . javaProject ) ; ArrayList visited = new ArrayList ( sourceLocations . length ) ; for ( int i = 0 , l = sourceLocations . length ; i < l ; i ++ ) { notifier . subTask ( Messages . build_cleaningOutput ) ; ClasspathMultiDirectory sourceLocation = sourceLocations [ i ] ; if ( sourceLocation . hasIndependentOutputFolder ) { IContainer outputFolder = sourceLocation . binaryFolder ; if ( ! ( visited . contains ( outputFolder ) ) ) { visited . add ( outputFolder ) ; IResource [ ] members = outputFolder . members ( ) ; for ( int j = 0 , m = members . length ; j < m ; j ++ ) { IResource member = members [ j ] ; if ( ! ( member . isDerived ( ) ) ) { member . accept ( new IResourceVisitor ( ) { public boolean visit ( IResource resource ) throws CoreException { resource . setDerived ( true ) ; return ( resource . getType ( ) ) != ( IResource . FILE ) ; } } ) ; } member . delete ( IResource . FORCE , null ) ; } } notifier . checkCancel ( ) ; if ( copyBack ) copyExtraResourcesBack ( sourceLocation , true ) ; } else { boolean isOutputFolder = sourceLocation . sourceFolder . equals ( sourceLocation . binaryFolder ) ; final char [ ] [ ] exclusionPatterns = ( isOutputFolder ) ? sourceLocation . exclusionPatterns : null ; final char [ ] [ ] inclusionPatterns = ( isOutputFolder ) ? sourceLocation . inclusionPatterns : null ; sourceLocation . binaryFolder . accept ( new IResourceProxyVisitor ( ) { public boolean visit ( IResourceProxy proxy ) throws CoreException { IResource resource = null ; if ( ( proxy . getType ( ) ) == ( IResource . FILE ) ) { if ( ( exclusionPatterns != null ) || ( inclusionPatterns != null ) ) { resource = proxy . requestResource ( ) ; if ( Util . isExcluded ( resource , inclusionPatterns , exclusionPatterns ) ) return false ; } if ( org . eclipse . jdt . internal . compiler . util . Util . isClassFileName ( proxy . getName ( ) ) ) { if ( resource == null ) resource = proxy . requestResource ( ) ; resource . delete ( IResource . FORCE , null ) ; } return false ; } if ( ( exclusionPatterns != null ) && ( inclusionPatterns == null ) ) { resource = proxy . requestResource ( ) ; if ( Util . isExcluded ( resource , inclusionPatterns , exclusionPatterns ) ) return false ; } notifier . checkCancel ( ) ; return true ; } } , IResource . NONE ) ; if ( ( ! isOutputFolder ) && copyBack ) { notifier . checkCancel ( ) ; copyPackages ( sourceLocation ) ; } } notifier . checkCancel ( ) ; } } else if ( copyBack ) { for ( int i = 0 , l = sourceLocations . length ; i < l ; i ++ ) { ClasspathMultiDirectory sourceLocation = sourceLocations [ i ] ; if ( sourceLocation . hasIndependentOutputFolder ) copyExtraResourcesBack ( sourceLocation , false ) ; else if ( ! ( sourceLocation . sourceFolder . equals ( sourceLocation . binaryFolder ) ) ) copyPackages ( sourceLocation ) ; notifier . checkCancel ( ) ; } } } protected void copyExtraResourcesBack ( ClasspathMultiDirectory sourceLocation , final boolean deletedAll ) throws CoreException { } protected void copyPackages ( ClasspathMultiDirectory sourceLocation ) throws CoreException { } protected IResource findOriginalResource ( IPath partialPath ) { } public String toString ( ) { } }

Fix:
for ( int i = 0 , l = this . javaBuilder . participants . length ; i < l ; i ++ )