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.classInteger.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 中抛出的异常”问题?

为啥设置 DataSource 时 ComboBox 不抛出异常?

PHP 检查抛出的异常类型

Django 对比get和filter区别