【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )

简介: 【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )

文章目录

一、报错信息

二、解决方案





一、报错信息


定义 Groovy 函数 ,


void fun(object) {
    object.hello()
}


如果传入的 实例对象 中 , 没有定义 hello 方法 , 会导致如下报错 ;



报错代码 :


class Student {
    def hello(){
        println "Hello Student"
    }
}
class Worker {
    def hello(){
        println "Hello Worker"
    }
}
class Farmer {}
void fun(object) {
    object.hello()
}
fun(new Student())
fun(new Worker())
// 下面的用法会报
// Caught: groovy.lang.MissingMethodException 异常
fun(new Farmer())


报错信息 :


Caught: groovy.lang.MissingMethodException: No signature of method: Farmer.hello() is applicable for argument types: () values: []
Possible solutions: sleep(long), sleep(long, groovy.lang.Closure), getAt(java.lang.String), each(groovy.lang.Closure), split(groovy.lang.Closure), wait()
groovy.lang.MissingMethodException: No signature of method: Farmer.hello() is applicable for argument types: () values: []
Possible solutions: sleep(long), sleep(long, groovy.lang.Closure), getAt(java.lang.String), each(groovy.lang.Closure), split(groovy.lang.Closure), wait()
  at Worker$hello.call(Unknown Source)
  at Groovy.fun(Groovy.groovy:20)
  at Groovy$fun.callCurrent(Unknown Source)
  at Groovy.run(Groovy.groovy:28)



image.png





二、解决方案


可以使用 respondsTo 方法 , 判定对象中是否定义了 hello 函数 ;


void fun(object) {
    if (object.respondsTo("hello")) {
        object.hello()
    }
}


也可参考 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 ) 博客 , 以牺牲动态特性 , 将其限制为静态语言 , 则不会出现上述运行时错误 ;



完整代码如下 :


class Student {
    def hello(){
        println "Hello Student"
    }
}
class Worker {
    def hello(){
        println "Hello Worker"
    }
}
class Farmer {}
void fun(object) {
    if (object.respondsTo("hello")) {
        object.hello()
    }
}
fun(new Student())
fun(new Worker())
// 下面的用法会报
// Caught: groovy.lang.MissingMethodException 异常
fun(new Farmer())


执行结果 :


Hello Student
Hello Worker


目录
相关文章
|
缓存
idea更改默认缓存位置步骤
在idea使用中,会产生大量的缓存,一般默认存放在C盘里面,会加大C盘的储存负担,如果C盘足够大,可以不考虑更改idea的缓存位置
4310 0
idea更改默认缓存位置步骤
|
Java 测试技术 Spring
springboot测试环境无法注入bean问题分析及解决方案
springboot测试环境无法注入bean问题分析及解决方案
4945 0
springboot测试环境无法注入bean问题分析及解决方案
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
376 6
|
Java Maven
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
在执行Maven项目中的`install`命令时,遇到编译插件版本不匹配的错误。具体报错为:`maven-compiler-plugin:3.13.0`要求Maven版本至少为3.6.3。解决方案是将Maven版本升级到3.6.3或降低插件版本。本文详细介绍了如何下载、解压并配置Maven 3.6.3,包括环境变量设置和IDEA中的Maven配置,确保项目顺利编译。
16073 5
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
33841 0
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
安全 Java 测试技术
【Java】已解决Java中的java.util.NoSuchElementException异常
【Java】已解决Java中的java.util.NoSuchElementException异常
1310 1
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
3798 1
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
29417 0