Java 如何解决IllegalArgumentException?
我有一个应用程序,它使用类加载器和反射来加载和调用方法。在运行时,我收到以下异常:java.lang.IllegalArgumentException:对象不是声明类的实例。这是我的密码:Java 如何解决IllegalArgumentException?,java,Java,我有一个应用程序,它使用类加载器和反射来加载和调用方法。在运行时,我收到以下异常:java.lang.IllegalArgumentException:对象不是声明类的实例。这是我的密码: File operatorFile = new File(OperatorsPath); URL operatorFilePath = operatorFile.toURL(); URL[] operatorFilePaths = new URL[]{operatorFilePath};
File operatorFile = new File(OperatorsPath);
URL operatorFilePath = operatorFile.toURL();
URL[] operatorFilePaths = new URL[]{operatorFilePath};
ClassLoader operatorsLoader = new URLClassLoader(operatorFilePaths);
Class operatorInterface = operatorsLoader.loadClass("Operator");
FilenameFilter filterDotClass = new FilenameFilter()
{
public boolean accept(File dir, String name)
{
return name.endsWith(".class");
}
};
File[] operatorFiles = new File(OperatorsPath).listFiles(filterDotClass);
Class[] operatorClass = new Class[operatorFiles.length-1];
int index = 0;
Method methodsInOperator;
Object instance;
String operatorSign;
Map<String , Object> operatorMap = new HashMap<String , Object>();
for (File oprFile : operatorFiles)
{
String filename = oprFile.getName();
//String filename = "operators."+oprFile.getName();
filename = filename.substring(0, filename.length() - 6);
Class currentClass = operatorsLoader.loadClass(filename);
if (!filename.equalsIgnoreCase("operator") && operatorInterface.isAssignableFrom(currentClass))
{
operatorClass[index] = currentClass;
instance = currentClass.newInstance();
methodsInOperator = currentClass.getMethod("getSign", null);
operatorSign = (String)methodsInOperator.invoke(instance, null);
operatorMap.put(operatorSign,instance);
++index;
}
}
while(expression != null)
{
String[] elementInExpression = expression.split(",");
if(elementInExpression.length != 3)
{
System.out.println("Expression should have two operand and 1 operator ");
throw new ValidationException("Validation on number of element failed1");
}
Validation.validateOperand(elementInExpression[0],elementInExpression[1]);
Validation.validateOperator(elementInExpression[2]);
double firstNumber = Double.parseDouble(elementInExpression[0]);
double secondNumber = Double.parseDouble(elementInExpression[1]);
double output = 0;
Object obj;
for(Class operatorCls : operatorClass)
{
obj = (Object)operatorMap.get(elementInExpression[2]);
methodsInOperator = operatorCls.getMethod("calculate", new Class[] { double.class, double.class } );
output =(double)methodsInOperator.invoke(obj, firstNumber, secondNumber);
}
processingResult.add(output);
expression = mathExpReader.readLine();
}
readerWriter.writeFile(path,processingResult);
有人能帮我吗?哪行抛出错误?output=doublemethodsInOperator.invokeobj,firstNumber,secondNumber;所以对象不是声明类的实例。。。。六羟甲基三聚氰胺六甲醚。。。。也许obj不是MethodsOperator引用的方法类的对象。我知道,但我不知道为什么在这部分抛出这个异常:if!filename.equalsIgnoreCaseoperator&&operatorInterface.isAssignableFromcurrentClass{operatorClass[index]=currentClass;instance=currentClass.newInstance;operatorMap.putoperatorSign,instance;++index;}我为evrey loaded Cals创建了一个实例,并根据键将其存储在一个映射中。我检索了这个实例并调用了该方法,但我不知道为什么不工作异常并不奇怪,因为for循环使用方法CalculatedDouble、double迭代多个类,但对于所有迭代,obj都是相同的,因为它在循环中被分配了相同的值。