Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么有时它给出例外,但有时不例外';T_Java_Exception - Fatal编程技术网

Java 为什么有时它给出例外,但有时不例外';T

Java 为什么有时它给出例外,但有时不例外';T,java,exception,Java,Exception,我的程序有两部分,一部分是数据结构,另一部分是操作 数据结构部分基本上是对象和对象集。此集合是扩展ArrayList的类。集合和对象是唯一的,我的意思是,如果我有一个名为a的类,那么我有一个集合,它将所有a对象都保存在其中 操作部分在这些集合上执行一些操作,大多数情况下,它也在运行时创建一个新类(在java文件中编写类并编译它,然后从反射库函数(例如constructor.newInstance(args);)调用它),并从新类创建一个对象,然后填充其中并返回它。因为我不想覆盖类,所以我使用UU

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

数据结构部分基本上是对象和对象集。此集合是扩展ArrayList的类。集合和对象是唯一的,我的意思是,如果我有一个名为a的类,那么我有一个集合,它将所有a对象都保存在其中

操作部分在这些集合上执行一些操作,大多数情况下,它也在运行时创建一个新类(在java文件中编写类并编译它,然后从反射库函数(例如constructor.newInstance(args);)调用它),并从新类创建一个对象,然后填充其中并返回它。因为我不想覆盖类,所以我使用UUID trimmed来命名在运行时创建的新类

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

那么为什么我的代码会这样呢

我在Ubuntu14.04上使用OracleJava1.8和IntellijIDEA(也尝试了Eclipse无更改)

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

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

最后一个字符串outerClassName=”“+initialInnerName+“Table”;
最后一个字符串innerClassName=”“+initialInnerName;
文件File=新文件(“./src/”);
URL=file.toURI().toURL();
URL URL[]=新URL[]{URL};
URLClassLoader1=新的URLClassLoader(URL);
类innerClass=loader1.loadClass(innerClassName);
设置newTable=null;
类outerClass=loader1.loadClass(outerClassName);
构造函数constructorofourterclass=outerClass.getDeclaredConstructors()[0];
Object[]objArg={innerClass,10};
newTable=(Set)constructorofueterclass.newInstance(objArg);
编辑2

在最后一个代码的最后一行引发的异常为:

newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);
newTable=(Set)constructorofoutclass.newInstance(objArg);
嗯,我已经尽可能多地做了MCVE。

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

Constructor<?> constructorOfOuterClass = outerClass.getDeclaredConstructors()[0];
Constructor constructorOfOuterClass=outerClass.getDeclaredConstructors()[0];
然后尝试用两个参数调用它:

Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);
Object[]objArg={innerClass,10};
newTable=(Set)constructorofueterclass.newInstance(objArg);
问题是,构造函数不一定按照您期望的顺序。没有特定的顺序是可以保证的,所以有时您会得到单参数构造函数,有时会得到双参数构造函数。当你得到两个参数的构造函数时,一切都很好。但是当你得到一个参数的构造函数并用两个参数调用它时,你非常清楚接下来会发生什么


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

我们需要查看代码以提供帮助。不要显示整个代码,也不要显示上下文之外不运行的块。如果您不确定是否可以共享部分代码,您可能需要查看其他地方;2.)不要添加所有的代码,创建一个MCVE,如上面的注释中所链接的。有一件事仍然不清楚:抛出异常的确切位置是哪里?具体是哪一行?好吧,我理解你的沮丧。为了记录在案,我没有在这个问题上投赞成票或反对票。我在等着看它是怎么形成的。这就是说,它的标准非常明确。当一个人注册时会有建议,有帮助中心,有很多好问题(赞成票)和坏问题(反对票)的例子。处理大量没有提供足够信息却想要答案的问题可能会令人沮丧。但我从来没有见过一个被否决的问题没有足够的指导。你做得很好,并且改进了这个问题。哦,好吧,那么当我在“.getDeclaredConstructors()”中使用构造函数时,你说的是什么?它没有按照java文件的书面顺序给出它?正确。它给了你一个未定义的顺序。非常感谢。这会对我有很大帮助。所以我把它改成这个,我想这会很好,对吗?谢谢我在for循环中尝试了这个(1000次尝试),没有例外。
Object[] objArg = {innerClass,10};
newTable = (Set<Template>) constructorOfOuterClass.newInstance(objArg);