TypeFrame frame = typeDataflow.getFactAtLocation(new Location(pei, basicBlock));
	private ExceptionSet enumerateExceptionTypes(BasicBlock basicBlock)		throws ClassNotFoundException, DataflowAnalysisException {		ExceptionSet exceptionTypeSet = new ExceptionSet();		InstructionHandle pei = basicBlock.getExceptionThrower();		Instruction ins = pei.getInstruction();		// Get the exceptions that BCEL knows about.		// Note that all of these are unchecked.		ExceptionThrower exceptionThrower = (ExceptionThrower) ins;		Class[] exceptionList = exceptionThrower.getExceptions();		for (int i = 0; i < exceptionList.length; ++i) {			exceptionTypeSet.addImplicit(new ObjectType(exceptionList[i].getName()));		}		// Assume that an Error may be thrown by any instruction.		exceptionTypeSet.addImplicit(Hierarchy.ERROR_TYPE);		// If it's an ATHROW, get the type from the TypeDataflow		if (ins instanceof ATHROW) {			TypeFrame frame = typeDataflow.getFactAtLocation(new Location(pei, basicBlock));			// Check whether or not the frame is valid.			// Sun's javac sometimes emits unreachable code.			// For example, it will emit code that follows a JSR			// subroutine call that never returns.			// If the frame is invalid, then we can just make			// a conservative assumption that anything could be			// thrown at this ATHROW.			if (!frame.isValid()) {				exceptionTypeSet.addExplicit(Type.THROWABLE);			} else {				Type throwType = frame.getTopValue();				if (!(throwType instanceof ObjectType))					throw new DataflowAnalysisException("Non object type thrown by " + pei);				exceptionTypeSet.addExplicit((ObjectType) throwType);			}		}		// If it's an InvokeInstruction, add declared exceptions and RuntimeException		if (ins instanceof InvokeInstruction) {			InvokeInstruction inv = (InvokeInstruction) ins;			ObjectType[] declaredExceptionList = Hierarchy.findDeclaredExceptions(inv, cpg);			if (declaredExceptionList == null) {				// Couldn't find declared exceptions,				// so conservatively assume it could thrown any checked exception.				if (DEBUG) System.out.println("Couldn't find declared exceptions for " +					SignatureConverter.convertMethodSignature(inv, cpg));				exceptionTypeSet.addExplicit(Hierarchy.EXCEPTION_TYPE);			} else {				for (int i = 0; i < declaredExceptionList.length; ++i) {					exceptionTypeSet.addExplicit(declaredExceptionList[i]);				}			}			exceptionTypeSet.addImplicit(Hierarchy.RUNTIME_EXCEPTION_TYPE);		}		if (DEBUG) System.out.println(pei + " can throw " + exceptionTypeSet);		return exceptionTypeSet;	}