为什么有时它会给出例外情况,但有时候却没有?

时间:2016-01-22 17:57:24

标签: java exception

我的程序有两个部分,一个是数据结构,另一个是第二个操作。

数据结构部分基本上是对象&那个对象的集合。该集是一个扩展ArrayList的类。 Set和Objects是唯一的,我的意思是如果我有一个名为A的类,那么我有一个Set,它保存所有A对象。

操作部分正在对这些集合进行一些操作,并且大多数时候它也在运行时创建一个新类(在java文件中编写类并编译它然后从Reflect库函数调用它,例如constructor.newInstance( args);)并从新类创建一个对象然后填充它并返回它。由于我不想覆盖类,因此我使用UUID修剪来命名在运行时创建的新类。

我注意到一些奇怪的事情。我运行我的代码并且它有效,然后我再次运行它并在创建set时,它给了我" java.lang.IllegalArgumentException:错误的参数数量"。我再次运行它异常,一次又一次然后我再次运行它然后没有异常。 (每当它创建一个像我想要的新类时)

那么为什么我的代码可以这样做?

我在Ubuntu 14.04上使用Oracle Java 1.8和Intellij Idea(也试过Eclipse没有变化)。

编辑代码: "我删除了与问题无关的代码"

这是我操作中出错的部分; (初始innerInnerName是随机生成的类名)

final String outerClassName = "" + initialInnerName + "Table";
final String innerClassName = "" + initialInnerName;

File file = new File("./src/");
URL url = file.toURI().toURL();
URL urls[] = new URL[]{url};
URLClassLoader loader1 = new URLClassLoader(urls);
Class<?> innerClass = loader1.loadClass(innerClassName);

Set<Template> newTable = null;
Class<?> outerClass = loader1.loadClass(outerClassName);
Constructor<?> constructorOfOuterClass = outerClass.getDeclaredConstructors()[0];
Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);

修改2

在最后一行代码的最后一行抛出异常:

newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);

我曾尽可能地尝试过MCVE。

1 个答案:

答案 0 :(得分:1)

你的&#34;外课&#34;有两个构造函数,一个接受一个参数,另一个接受两个。当你去实例化外部类时,你会得到构造函数列表中的第一个:

Constructor<?> constructorOfOuterClass = outerClass.getDeclaredConstructors()[0];

然后你尝试用两个参数调用它:

Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);

问题在于构造函数不一定按照您期望的顺序。没有特定的顺序可以保证,所以有时你会得到一个参数构造函数,有时候会得到两个参数构造函数。当你得到两个参数构造函数时,一切都很好。但是当你得到一个参数构造函数并用两个参数调用它时,那么你就会非常清楚会发生什么。

您需要确定哪个构造函数是您想要的构造函数,然后选择它,而不是假设它是列表中的第一个构造函数。