getDeclaredMethod 抛出异常
Posted
技术标签:
【中文标题】getDeclaredMethod 抛出异常【英文标题】:getDeclaredMethod throws exception 【发布时间】:2014-06-11 19:33:56 【问题描述】:我想编写一个通过 rpc 进行通信的客户端服务器应用程序。该代码适用于没有参数的函数。但是,当我尝试使用单个参数调用函数时(不支持更多参数),它会给我一个“NoSuchMethodException”。
以下是重要部分:
我要调用的函数: (rpcserver.CarPark.in)
public boolean in(int num)
if(!closed)
if (num <= (maxLots - curLots))
curLots += num;
return true;
return false;
public boolean in()
if(!closed)
if (curLots < maxLots)
curLots += 1;
return true;
return false;
下面是调用函数的代码: (我使用procedure[0]作为函数名,使用[1]作为参数。
if(procedure.length == 1)
try
Method method = CarPark.class.getDeclaredMethod((String)procedure[0]);
return method.invoke(park);
catch (Exception e)
throw new Exception("Server couldn't find a fitting procedure.");
else
// length of 2, more isn't possible
try
System.out.println((String)procedure[0] + ", " + procedure[1].getClass());
Method method = CarPark.class.getDeclaredMethod((String)procedure[0], procedure[1].getClass());
return method.invoke(park,procedure[1]);
catch (Exception e)
throw new Exception("Server couldn't find a fitting procedure." + e);
奇怪的是,函数返回:java.lang.NoSuchMethodException: rpcserver.CarPark.in(java.lang.Integer)
但是,println 命令给了我这个:in, class java.lang.Integer
那为什么我可以调用不带参数的过程却有参数的问题呢?
谢谢
【问题讨论】:
目前尚不清楚您传递的参数是什么,但我最初的怀疑是procedure[1]
是Integer
而不是int.class
。 (而且您确实应该将该数组封装到一个对象中;它读起来令人困惑,几个月后您再看它时也会感到困惑。)
procedure[1] 设置为 Integer.parseInt(string);我对 Java 很不好,那么 int.class 和 Integer 有什么区别?对象是什么意思?
【参考方案1】:
问题是您尝试获取的CarPark.in
版本采用原始整数,而getDeclaredMethod
正在寻找采用java.lang.Integer
的版本,这不是一回事。如果您将int.class
或Integer.TYPE
传递给getDeclaredMethod
,您将看到它能够正确找到该方法。
如果没有看到您的完整代码,建议一个适合您的解决方案并不难,但请记住基元类型与其盒装等效项之间的区别,并警惕autoboxing。
【讨论】:
嗨,我必须解析来自用户的输入,然后如果它“看起来”像整数,则转换变量。我这样做是这样的:int num = Integer.parseInt((String)procedure[1]);
,如果可能的话,我用 int 替换字符串。 procedure[1] = num
.
@ruhigbrauner 你还没有显示procedure
是什么类型;我假设它是Object[]
。在这种情况下,赋值procedure[1] = num
将隐式地将num
装箱到java.lang.Integer
。
是的。如何使用原始类型将 String 转换为 Int?否则我将不得不检查参数是什么类型,然后将原始 int 用于getDeclaredMethod
。
如果我检查rocedure[1].getClass() == Integer.TYPE
然后使用getDeclaredMethod((String)procedure[0], Integer.TYPE)
,它会起作用。我不必告诉你,这看起来有多难看。 Java 太乱了!
@ruhigbrauner Java 有它的缺点,但它的反射系统对于强类型语言来说是最干净的。很多问题只是您自己手动完成,而不是使用库(或者可能是 Groovy)来为您处理。以上是关于getDeclaredMethod 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
Flutter web - 调用 http.get 抛出异常
Boost::Asio - 抛出 get_io_service 异常
如何解决“SparkException:Future.get 中抛出的异常”问题?