if (detectors == null) createDetectors();
createDetectors();
  public void execute() throws java.io.IOException, InterruptedException {	// Configure the analysis context	analysisContext = new AnalysisContext(bugReporter);	analysisContext.setSourcePath(project.getSourceDirList());	// Give the BugReporter a reference to this object,	// in case it wants to access information such	// as the AnalysisContext	bugReporter.setEngine(this);	// Create detectors, if required	if (detectors == null)		createDetectors();	// Clear the repository of classes	clearRepository();	// Get list of files to analyze.	// Note that despite the name getJarFileArray(),	// they can also be zip files, directories,	// and single class files.	String[] argv = project.getJarFileArray();	// Report how many archives/directories/files will be analyzed,	// for progress dialog in GUI	progressCallback.reportNumberOfArchives(argv.length);	// Keep track of the names of all classes to be analyzed	List<String> repositoryClassList = new LinkedList<String>();	// Add all classes in analyzed archives/directories/files	for (int i = 0; i < argv.length; i++) {		addFileToRepository(argv[i], repositoryClassList);		}	// Callback for progress dialog: analysis is starting	progressCallback.startAnalysis(repositoryClassList.size());	// Examine all classes for bugs.	// Don't examine the same class more than once.	// (The user might specify two jar files that contain	// the same class.)	Set<String> examinedClassSet = new HashSet<String>();	for (Iterator<String> i = repositoryClassList.iterator(); i.hasNext(); ) {		String className = i.next();		if (examinedClassSet.add(className))			examineClass(className);		}	// Callback for progress dialog: analysis finished	progressCallback.finishPerClassAnalysis();	// Force any detectors which defer work until all classes have	// been seen to do that work.	this.reportFinal();	// Flush any queued bug reports	bugReporter.finish();	// Flush any queued error reports	bugReporter.reportQueuedErrors();  }