精神哥讲Crash(二): java.lang.NoSuchMethodError

圣诞节到啦,精神哥披着红大衣,戴上红高帽,想着偷偷爬入各位办公楼的烟囱,给大家的座位上留下一包鸡爪作为圣诞礼物! 奈何精神哥太胖,肚子太大爬不进烟囱了,想着大家肯定也在加班没法做到偷偷,就单方面决定还是给大家送文章吧!

话不多说,下来精神哥给大家分享的第二个Crash是“java.lang.NoSuchMethodError”。

一、java.lang.NoSuchMethodError 基本介绍

全名

java.lang.NoSuchMethodError

官方解释

Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method.意思就是程序找不到你要用的那个方法!

影响力排名

出错量排名第4

精神哥点评

抛出这异常,只能怪这个喜新厌旧、鱼龙混杂的社会!虽然是社会的错,但你不想办法解决它,就只能等屎了!

java.lang.NoSuchMethodError 问题的根本原因是开发编译时所依赖的环境,跟实际App运行的环境不匹配。

二、错误场景分析

1、你就喜欢搞新API,这么喜新厌旧!你家妞知道不?

错误代码

//检查该acitivity是否已经销毁public static boolean isActivityClose( Activity activity){ if(activity != null){ return activity.isDestroyed(); } return false ;}

编译环境

Android 4.2 SDK( API LEVEL 17)

运行环境

Android 4.0 设备( API LEVEL 14)

期望结果

正确返回activity是否已经销毁。

实际结果

Crash!!java.lang.NoSuchMethodError:com.tencent.bugly.crashreport.test.MainActivity.isDestroyed

原因分析

Activity.isDestroyed()方法是Android 4.2增加的,在这之前的系统肯定找不到这个方法,所以在4.2之前的设备上都会Crash!

解决方法

调用时对当前系统API LEVEL做判断,如果小于17就放弃调用

修复代码

public Boolean isActivityClose( Activity activity){ if(Build.VERSION.SDK_INT < 17) return null; if(activity != null){ return activity.isDestroyed(); } return false ;}

2、@Deprecated的API厂家最爱删,你竟然敢用?

API标志

@Deprecated标注的API

标志描述

Annotation type used to mark program elements that should no longer be used by programmers.这个API后面随时会被干掉!

现状描述

谷歌还是比较小心的,精神哥发现Android的SDK及Android的亲儿子设备上,这些@Deprecated的API基本上都保留了,谷歌最多就是置空实现或直接抛出一个非法访问的异常,所以开发过程中并没有感觉到API过期不能用(当然有警告啦) 但谷歌亲儿子设备只占Android设备的冰山一角,很多厂家可没管那么多,为了尽可能的节省资源,大刀阔斧的对API进行裁剪,而这个@Deprecated的API就是最有理由被干掉的,所以出现大量的java.lang.NoSuchMethodError的Crash!

3、@Hide的API是人家谷歌私有的,删改都不会跟你商量的,你还敢用吗?

API标志

@Hide标注的API

标志描述

When applied to a package, class, method or field, @hide removes that node and all of its children from the documentation.这个API压根不想让你看到,更别说让你使用了。

现状描述

由于Android的开源,加上Java的反射机制的便利,开发者总是喜欢研究源码,用注入或反射的方式获取到官方未正式开放的能力。这很有效,但也很危险,因为谷歌随时会调整,会导致你的App出现各种诡异的java.lang.NoSuchMethodError! 很多同学认为public的私有API,谷歌不会乱改,可以大胆的用。精神哥,随手给你挑一个反例来证明你的天真:android.content.pm.PackageParser(该类用于apk安装包内容解析,很受欢迎)这个私有类的public构造函数在5.0发生变化了,而之前一直没变过。 //5.0以前有String作为参数,用于传入apk路径public PackageParser(String archiveSourcePath) { mArchiveSourcePath = archiveSourcePath;} //5.0优化成无参实现了,一个对象可以多次解析了public PackageParser() { mMetrics = new DisplayMetrics(); mMetrics.setToDefaults();} 想看PackageParser.java源码又懒得找的同学,公众号里@精神哥,我给你发哈!

java.lang.NoSuchMethodError在Bugly影响力排行榜中稳居第4,就能看出Android程序员所面对的Android市场,碎片化有多么的严峻了!

精神哥想不出可以一劳永逸的解决方法,在这里再给大家总结几个私人建议(欢迎拍砖):

  • 开发阶段用Android Lint,静态检查代码中API兼容性。
  • 预发布前用Bita ( bita.qq.com 腾讯云测试平台),动态检测主流真机的兼容性。
  • 使用腾讯Bugly( bugly.qq.com 腾讯Bugly),实时掌握应用在真实用户环境中的遗留问题。

原文发布于微信公众号 - 腾讯Bugly(weixinBugly)

原文发表时间:2014-12-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【计算机基本概念】中央处理器

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control U...

3495
来自专栏freesan44

python 携程爬虫开发笔记

最近购买了《Python3 爬虫、数据清洗与可视化实战》,刚好适逢暑假,就尝试从携程页面对广州的周边游产品进行爬虫数据捕捉。 因为才学Python不够一个星期...

5891
来自专栏魏艾斯博客www.vpsss.net

百度站长工具 https 认证成功全记录

1963
来自专栏互联网技术栈

Dubbo 3.0 即将到来

据了解,新的 Dubbo 内核与 Dubbo 2.0 完全不同,但它兼容 2.0。Dubbo 3.0 将以 Streaming 为内核,而不再是 2.0 时代的...

1102
来自专栏即时通讯技术

满血复活:阿里的开源Dubbo 3.0要来了!

2018年1月8日夜间,Dubbo 创始人之一梁飞在 Dubbo 交流群里透露了 Dubbo 3.0 正在动工的消息。

771
来自专栏程序员互动联盟

同样的技术,为何别人总是能挖到漏洞 ?

菜鸟和高手的区别,不完全在于你学了多少,更看你能否清晰认知到目前所处阶段,正确迸发出对下一阶段知识的渴望。

1362

Apache Hadoop:通过重构降低技术债务

如果没有将实际行动纳入代码来控制和解决技术债务的话,那么技术债务将一文不值。为了阐述这种能自动修正代码缺陷的能力,而这些缺陷恰恰又是增加这些意外债务的元凶,我们...

1212
来自专栏知识分享

关于PLC高速计数器使用

今天去面试问我高速计数器,因为没用过,所以直接说--不会.但是自己感觉自己自学电气,说不会太丢人了,所以今天学了PLC的高速计数器.虽然没有书,但是有度娘,还有...

3759
来自专栏数据小魔方

一言不合就爬虫系列之——爬取小姐姐的秒拍MV

大连的盛夏实在是热的让人心烦(对于我这种既怕热又怕冷的真的没地呆了)。 再加上令人头疼的毕业论文,这种日子怎能缺少MV来解暑呢。 既然要听,怎么只听一首呢,既然...

4225
来自专栏FreeBuf

遨游浏览器把全球用户的这些数据偷偷传回了北京服务器

其实咱中国的Maxthon遨游浏览器在国际上也还是有一定知名度的,从StatsMonkey前年的数据来看,它在中国的市场份额排名第6,在波兰的份额也是第6。 最...

2239

扫码关注云+社区

领取腾讯云代金券