catchList = new ArrayList<CaughtException>(); throwList = new ArrayList<ThrownException>();
catchList = new ArrayList<ExceptionCaught>(); throwList = new ArrayList<ExceptionThrown>();
	public void visitCode(Code obj) {		catchList = new ArrayList<CaughtException>();		throwList = new ArrayList<ThrownException>();                stack.resetForMethodEntry(this);		super.visitCode(obj);		for (CaughtException caughtException : catchList) {			Set<String> thrownSet = new HashSet<String>();			for (ThrownException thrownException : throwList) {				if (thrownException.offset >= caughtException.startOffset						&& thrownException.offset < caughtException.endOffset) {					thrownSet.add(thrownException.exceptionClass);					if (thrownException.exceptionClass.equals(caughtException.exceptionClass))						caughtException.seen = true;				}			}			int catchClauses = 0;			if (caughtException.exceptionClass.equals("java.lang.Exception") && !caughtException.seen) {				// Now we have a case where Exception is caught, but not thrown				boolean rteCaught = false;				for (CaughtException otherException : catchList) {					if (otherException.startOffset == caughtException.startOffset							&& otherException.endOffset == caughtException.endOffset) {						catchClauses++;						if (otherException.exceptionClass.equals("java.lang.RuntimeException"))							rteCaught = true;					}				}				int range = caughtException.endOffset - caughtException.startOffset;				if (!rteCaught) {					int priority = LOW_PRIORITY + 1;					if (range > 300) priority--;					else if (range < 30) priority++;					if (catchClauses > 1) priority++;					if (thrownSet.size() > 1) priority--;					if (caughtException.dead) priority--;					bugReporter.reportBug(new BugInstance(this, "REC_CATCH_EXCEPTION",							priority)							.addClassAndMethod(this)							.addSourceLine(this, caughtException.sourcePC));				}			}		}	}