if (!reachable(edge, thrownExceptionSet)) { deletedEdgeSet.add(edge); }
checkReachability(edge, thrownExceptionSet, deletedEdgeSet, markedEdgeList);
	public void execute() throws ClassNotFoundException, DataflowAnalysisException {		HashSet<Edge> deletedEdgeSet = new HashSet<Edge>();		// Scan all basic blocks for infeasible exception edges		Iterator<BasicBlock> i = cfg.blockIterator();		while (i.hasNext()) {			BasicBlock basicBlock = i.next();			if (basicBlock.isExceptionThrower()) {				// Enumerate the kinds of exceptions this block can throw				ExceptionSet thrownExceptionSet = enumerateExceptionTypes(basicBlock);				// For each exception edge, determine if				// the handler is reachable.  If not, delete it.				// This ABSOLUTELY relies on the handled exception edges being				// enumerated in decreasing order of priority,				// because we eliminate thrown types as we encounter				// handlers where they are guaranteed to be caught.				for (Iterator<Edge> j = cfg.outgoingEdgeIterator(basicBlock); j.hasNext(); ) {					Edge edge = j.next();					if (edge.getType() == HANDLED_EXCEPTION_EDGE) {						if (!reachable(edge, thrownExceptionSet)) {							deletedEdgeSet.add(edge);						}					}				}				// If all exceptions are caught, mark the unhandled exception edge				// for deletion				if (thrownExceptionSet.isEmpty()) {					Edge edge = cfg.getOutgoingEdgeWithType(basicBlock, UNHANDLED_EXCEPTION_EDGE);					if (edge != null) {						deletedEdgeSet.add(edge);					}				}			}		}		// Remove deleted edges		for (Iterator<Edge> j = deletedEdgeSet.iterator(); j.hasNext(); ) {			Edge edge = j.next();			cfg.removeEdge(edge);			if (STATS) ++numEdgesPruned;		}	}