int endHandlerLinenumber = lineNumbers.getSourceLine(afterHandler) -1;
int endHandlerLinenumber = getNextExecutableLineNumber(lineNumbers, afterHandler) - 1;
    public void visit(Code obj) { 	CodeException [] exp = obj.getExceptionTable();	LineNumberTable  lineNumbers = obj.getLineNumberTable();	if (exp == null) return;	byte [] code = obj.getCode();	for(int i = 0; i < exp.length; i++)  {	  int handled = exp[i].getHandlerPC();	  int start = exp[i].getStartPC();	  int end = exp[i].getEndPC();	  int cause = exp[i].getCatchType();	  boolean exitInTryBlock = false;	  if (DEBUG) {		System.out.println("start = " + start					+ ", end = " + end					+ ", handled = " + handled);		}	  for(int j = start; j <= end;)   {	    int opcode = asUnsignedByte(code[j]);	    if (opcode >= IRETURN && opcode <= RETURN		|| opcode >=IFEQ && opcode <= GOTO				&& (opcode != GOTO || j < end)			) {			exitInTryBlock =  true;			if (DEBUG) 			System.out.println("	exit: " + opcode 				+ " in " + getFullyQualifiedMethodName());			break;			}		if (NO_OF_OPERANDS[opcode] < 0)  {			exitInTryBlock = true;			break;			}		j += 1+NO_OF_OPERANDS[opcode];		}	  if (exitInTryBlock) {		if (DEBUG) System.out.println("Exit in try block");		continue;		}	  if (handled < 5) continue;	  String c ;	  if (cause == 0)		c = "Throwable";	  else		{		c = Utility.compactClassName(		  getConstantPool().getConstantString(cause,					CONSTANT_Class), false);		if (!isChecked(c)) continue;		}	int jumpAtEnd = 0;	if (asUnsignedByte(code[end]) == GOTO) {		jumpAtEnd = getUnsignedShort(code,end+1);		if (jumpAtEnd < handled) jumpAtEnd = 0;		}	int opcode = asUnsignedByte(code[handled]);	int afterHandler = 0;	if (DEBUG) System.out.println( "DE:	opcode is "  + opcode + ", " + asUnsignedByte(code[handled+1]));	boolean drops = false;	boolean startsWithASTORE03 = opcode >= ASTORE_0                && opcode <= ASTORE_3;	if ( startsWithASTORE03		 && asUnsignedByte(code[handled+1]) == RETURN) {		if (DEBUG) System.out.println("Drop 1");		drops = true;		afterHandler= handled+1;		}	if (handled+2 < code.length		&&opcode == ASTORE		 && asUnsignedByte(code[handled+2]) == RETURN) {		drops = true;		afterHandler= handled+2;		if (DEBUG) System.out.println("Drop 2");		}	if (handled+3 < code.length	   && !exitInTryBlock) {	if (DEBUG) System.out.println( "DE: checking for jumps");	if ( startsWithASTORE03		 && asUnsignedByte(code[handled-3]) == GOTO) {		int offsetBefore = 			getUnsignedShort(code,handled-2);		if (DEBUG) System.out.println("offset before = " + offsetBefore);		if (offsetBefore == 4) {			drops = true;			afterHandler= handled+1;			if (DEBUG) System.out.println("Drop 3");			}		}	if ( opcode == ASTORE		 && asUnsignedByte(code[handled-3]) == GOTO) {		int offsetBefore = 			getUnsignedShort(code,handled-2);		if (offsetBefore == 5) {			drops = true;			afterHandler= handled+2;			if (DEBUG) System.out.println("Drop 4");			}		}	if ( startsWithASTORE03		 && asUnsignedByte(code[handled+1]) == GOTO 		 && asUnsignedByte(code[handled-3]) == GOTO) {		int offsetBefore = 			getUnsignedShort(code,handled-2);		int offsetAfter = 			getUnsignedShort(code,handled+2);			if (offsetAfter > 0 && offsetAfter+4 == offsetBefore)	  {			drops = true;			afterHandler= handled+4;			if (DEBUG) System.out.println("Drop 5");			}		}	if ( opcode == ASTORE		 && asUnsignedByte(code[handled+2]) == GOTO 		 && asUnsignedByte(code[handled-3]) == GOTO) {		int offsetBefore = 			getUnsignedShort(code,handled-2);		int offsetAfter = 			getUnsignedShort(code,handled+3);			if (offsetAfter > 0 && offsetAfter+5 == offsetBefore)	  {			drops = true;			afterHandler= handled+5;			if (DEBUG) System.out.println("Drop 6");			}		}	}	boolean multiLineHandler = false;	if (afterHandler > handled && lineNumbers != null) {	  int startHandlerLinenumber = lineNumbers.getSourceLine(handled);	  int endHandlerLinenumber = lineNumbers.getSourceLine(afterHandler) -1;	  if (DEBUG) System.out.println("Handler in lines " 			+ startHandlerLinenumber			+ "-"			+ endHandlerLinenumber);	  if (endHandlerLinenumber >  startHandlerLinenumber) {		multiLineHandler = true;		if (DEBUG) System.out.println("Multiline handler");		}	}				if (end-start >= 5 && drops && !c.equals("java.lang.InterruptedException")			&& !c.equals("java.lang.CloneNotSupportedException")) {	int priority = NORMAL_PRIORITY;	if (exitInTryBlock) priority++;	SourceLineAnnotation srcLine  		= SourceLineAnnotation.fromVisitedInstruction(this, handled);	if (srcLine != null && LOOK_IN_SOURCE_TO_FIND_COMMENTED_CATCH_BLOCKS) {	    if (catchBlockHasComment(srcLine)) 			return;	    else priority++;		}	else {		// can't look at source		if (lineNumbers == null || multiLineHandler) priority+=2;		}	if (DEBUG) {		System.out.println("Priority is " + priority);		}	if (priority > LOW_PRIORITY) return;	if (DEBUG) {		System.out.println("reporting warning");		}				String key = (exitInTryBlock ? "mightDrop," : "mightIgnore,") + getFullyQualifiedMethodName() + "," + c;	if (reported.add(key)) {		BugInstance bugInstance = new BugInstance(		   exitInTryBlock ? "DE_MIGHT_DROP" : "DE_MIGHT_IGNORE", 		   priority)			.addClassAndMethod(this);		bugInstance.addSourceLine(srcLine);		bugInstance.addClass(c).describe("CLASS_EXCEPTION");		bugReporter.reportBug(bugInstance);	}	}		}}