暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AbstractMethodError 那些事

Java有货 2020-06-23
895

点击上方「Java有货」关注我们


技术交流群添加方式



+


添加小编微信:372787553,备注:进群

带您进入Java技术交流群







前言       

java.lang.AbstractMethodError

这样的异常并不常见,如果您有幸遇到了,那么一定要珍惜,否则转瞬即逝!







发生原因

为什么会发生这样的错误?

让我们看一下官方的解释:

当应用程序尝试调用抽象方法时抛出。通常,该错误被编译器捕获;  如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。







异常结构 







验证及解决方案







创建V1.0抽象接口并实现

abstract class B {
// v1.0
    public abstract void changedMethodInDifVersion(int arg1);
}


class BImpl extends B{


@Override
public void changedMethodInDifVersion(int arg1) {
System.out.println("结果为:"+arg1);
}
}






验证代码

public class MainTest {


public static void main(String[] args) {
B dependency = new BImpl();
dependency.changedMethodInDifVersion(1);
    }
}






验证结果

以上的代码都可以正常运行,接下来我们对接口进行升级改造







创建V2.0抽象接口并实现

abstract class B {
// v2.0
public abstract void changedMethodInDifVersion(int arg1,int arg2);


}


class BImpl extends B{


@Override
public void changedMethodInDifVersion(int arg1,int arg2) {
System.out.println("结果为:"+(arg1+arg2));
}
}






验证代码

public class MainTest {


public static void main(String[] args) {
B dependency = new BImpl();
dependency.changedMethodInDifVersion(1,2);
}
}






验证结果

神奇的报错了,为何会发生错误的错误,是不是很尴尬,竟然中招了?

来让我们看看具体的报错:
Exception in thread "main" java.lang.AbstractMethodError:
Receiver class com.javayh.json.test.BImpl does not define or
inherit an implementation of the resolved method
'abstract void changedMethodInDifVersion(int, int)'
of abstract class com.javayh.json.test.B.
at com.javayh.json.test.MainTest.main(MainTest.java:16)

我们可以看到does not define or inherit an implementation of the resolved method 'abstract void changedMethodInDifVersion(int, int)' of abstract class
这样的提示,但是我们已经继承了该类的方法?那么错误肯定不在我们的代码,而在他编译解析的地方出了错误!接下来我们看看编译后的源码;

神奇的发现,BImpl 内的方法并没编译成功,这样我们重新进行编译,javac一下

这是我们我们发现错误已经解决,可以正常的运行!

为何会这样?其实在文章的起始位置已经说了发生原因,这是我们在来理解一下:

当应用程序尝试调用抽象方法时抛出。通常,该错误被编译器捕获;  如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能在运行时发生。

理解:

  • 该错误被编译器捕获:

    现在的开发工作已经都转向了各种开发工具,这样的错误应该不会发生,大佬们使用记事本写代码 时,很有可能发生

  • 如果某些类的定义自上次编译当前执行的方法以来不兼容地更改

    当我们对原有的方法进行了升级改造,开发工具为我躲避了第一步的错误,但是并没有办法完全的躲避编译时的错误,这时我们执行就会报如上的错误了,这时候我们只需要重新执行编译一下 javac/mvn compile

往期好文

1.JVM 调优实战

2.Spring Aop实战案例二

3.程序员都在读的书,你也不能错过哦!

4.Java设计模式之策略者模式

5.Redis之缓存穿透与缓存击穿

6.Redis之缓存雪崩

7.Docker三剑客Compose命令介绍与使用

8.JDK14的重大更新

9.IDEA 2020重大更新,快来抢先get一下

10.异常处理之全局异常捕获

11.Java 8系列之重新认识HashMap

12.聊聊MyBatis二级缓存机制

13.Map merge 你不知道的一波骚操作



小编寄语

小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!

小编微信:372787553

备注为进群,通过后小编会邀请您进群!



Ja


va













文章转载自Java有货,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论