if (DEBUG) System.out.println(pei + " can throw " + exceptionTypeSet);
	private Set<ObjectType> enumerateExceptionTypes(BasicBlock basicBlock)		throws ClassNotFoundException, DataflowAnalysisException {		Set<ObjectType> exceptionTypeSet = new HashSet<ObjectType>();		InstructionHandle pei = basicBlock.getExceptionThrower();		Instruction ins = pei.getInstruction();		// Get the exceptions that BCEL knows about		ExceptionThrower exceptionThrower = (ExceptionThrower) ins;		Class[] exceptionList = exceptionThrower.getExceptions();		for (int i = 0; i < exceptionList.length; ++i) {			exceptionTypeSet.add(new ObjectType(exceptionList[i].getName()));		}		// 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.add(new ObjectType("java.lang.Throwable"));			} else {				Type throwType = frame.getTopValue();				if (!(throwType instanceof ObjectType))					throw new DataflowAnalysisException("Non object type thrown by " + pei);				exceptionTypeSet.add((ObjectType) throwType);			}		}		// If it's an InvokeInstruction, add declared exceptions		if (ins instanceof InvokeInstruction) {			InvokeInstruction inv = (InvokeInstruction) ins;			Method method = Lookup.findExactMethod(inv, cpg);			if (method != null) {				ExceptionTable exceptionTable = method.getExceptionTable();				if (exceptionTable != null) {					String[] exceptionNameList = exceptionTable.getExceptionNames();					for (int i = 0; i < exceptionNameList.length; ++i ) {						exceptionTypeSet.add(new ObjectType(exceptionNameList[i]));					}				}			}		}		return exceptionTypeSet;	}