} else { if (DEBUG_NULLARG) System.out.println(" ==> no constraint");
	private void checkNonNullParam(			Location location, 			ConstantPoolGen cpg,			TypeDataflow typeDataflow,			InvokeInstruction invokeInstruction,			BitSet nullArgSet,			BitSet definitelyNullArgSet) throws ClassNotFoundException {		// Go up the class hierarchy finding @NonNull and @PossiblyNull annotations.		final List<NonNullSpecification> specificationList = new LinkedList<NonNullSpecification>();		JavaClassAndMethodChooser nonNullContractCollector = new JavaClassAndMethodChooser() {			public boolean choose(JavaClassAndMethod classAndMethod) {				XMethod xmethod = XMethodFactory.createXMethod(						classAndMethod.getJavaClass(), classAndMethod.getMethod());				NonNullSpecification specification = new NonNullSpecification(						classAndMethod,						wrapProperty(nonNullParamDatabase.get().getProperty(xmethod)),						wrapProperty(possiblyNullParamDatabase.get().getProperty(xmethod)));				specificationList.add(specification);								return false;			}		};		// See if any null arguments violate a @NonNull annotation.		int numParams = new SignatureParser(method.getSignature()).getNumParameters();		Hierarchy.findInvocationLeastUpperBound(invokeInstruction, cpg, nonNullContractCollector);		BitSet checkedParams = new BitSet();		BitSet violatedParamSet = new BitSet();		List<NonNullParamViolation> violationList = new LinkedList<NonNullParamViolation>();		for (NonNullSpecification specification : specificationList) {			for (int i = 0; i < numParams; ++i) {				if (!nullArgSet.get(i) || checkedParams.get(i))					continue;								// Arg is null, and we haven't seen a specification for the parameter yet.				// See if this method defines a specification.				if (specification.possiblyNullProperty.isNonNull(i)) {					// Parameter declared @PossiblyNull.					// So it's OK to pass null.					checkedParams.set(i);				} else if (specification.nonNullProperty.isNonNull(i)) {					// Parameter declated @NonNull.					// This is a violation.					violationList.add(new NonNullParamViolation(specification.classAndMethod, i));					violatedParamSet.set(i);					checkedParams.set(i);				}			}		}		if (violationList.isEmpty())			return;				XMethod xmethod = XMethodFactory.createXMethod(invokeInstruction, cpg);				WarningPropertySet propertySet = new WarningPropertySet();		MethodGen methodGen = classContext.getMethodGen(method);		String sourceFile = classContext.getJavaClass().getSourceFileName();		BugInstance warning = new BugInstance("NP_NONNULL_PARAM_VIOLATION", NORMAL_PRIORITY)			.addClassAndMethod(methodGen, sourceFile)			.addSourceLine(methodGen, sourceFile, location.getHandle())			.addMethod(xmethod).describe("METHOD_CALLED");				addParamAnnotations(definitelyNullArgSet, violatedParamSet, propertySet, warning);				for (NonNullParamViolation violation : violationList) {			warning.addMethod(violation.classAndMethod.getJavaClass(), violation.classAndMethod.getMethod());			warning.addInt(violation.param).describe("INT_NONNULL_PARAM");		}		finishWarning(location, propertySet, warning);				bugReporter.reportBug(warning);	}