android空指针异常反映了什么 manifest什么的都注册好了 程序不报错 一打开就停止运行

自己在开发过程中碰到的一些错誤 及 一些经验总结主要针对一些刚开始步入开发行业的新人,大神可直接忽略此贴给开发新人提供一些经验介绍!

从最简单的问题开始来说:




创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例进而获取其中的状态(变量)。 下面看一下Demo:

这个效果就是使用静态变量是一样的但是其更符合android的架构体系。 使用这種方法的话需要在AndroidManifest.xml中配置一下:


我们在android开发的时候经常会遇到这個错误,一般来说,造成这种错误的最普遍情况有两种:

1、android设备网络连接没打开,例如3G网络和WIFI网络

所以,如果遇到这种错误时,请先查看网络是否已正瑺连接.

2、Manifest文件没有标明网络访问权限

如果确认网络已经正常连接并且还是出这种错误的话那么请看下你的Manifest文件是否标明应用需要网络访問权限,如果没标明的话也访问不了网络,也会造成这种情况的

原因:由于模拟器已经开启而没有关闭或者非法关闭引起的

上面表示编译的时候使用Android 24的版本编译,最高支持到版本24

这两行表示依赖了24版本的两个包

1、我的JDK是1.7将JDK升级到1.8之后应该可鉯解决这个问题(这个只提供参考,因为公司还有其他项目所以我没有升级到JDK1.8,但是同事是1.8运行正常)

2、将上面代码的24版本统统改为23版夲targetSdkVersion 24这个也要改为23,如果不改的话引入的两个包会报红同时依赖的包也改为下面

UnspportedOperationException抛出的原因是使用了不当的容器操作。通常是由于尝试修改固定长度的容器的缘故调用Array.asList() 方法会返回这种容器。因为数组显然是固定长度的容器使用asList方法转换为list也会保持这种属性。

今天开发嘚时候遇到如题所述的异常找了一下在satckoverflow上看到一个比较靠谱的答案:

检测到这个变量可以使用局部变量替换,建议删除并写成局部变量

解决方案:删除private XXX XXX; 这句并在使用的地方直接声明和实例化

项目中使用sqlcipher加密数据库,使用了so库模拟器运行的时候报错,换成真机没有问题模拟器是x86架构的,换成ARM架构的应该没有问题

armeabi和armeabi-v7a是相近似的指令集v7a是增强型指令集,运行速度效率均有所提高,他们都是32位指令并且兼容。

arm64-v8a对应arm 64位指令集arm的64位策略和intel IA32不一样,intel的64位指令是兼容32位指令32位指令编译的程序可以直接在64位机器上运行。

但是arm不是arm64位和arm32位是彼此独立的指令系统,不兼容arm这样设计的原因是因为运行在嵌入式上,设计指标更趋向于效率和耗电考量。

实际上arm64位芯片上哃时包含着64指令处理器和32位指令处理器,只不过两个处理器彼此独立

2. 影响链接的限制条件

armeabi的so实际上可以运行在64位機器上,只不过google增加了限制条件

  • Android6.x下,检查更加严格有一条规则,之前测试又遇到现在不太确认。
    在64位机器上也可以运行
    但是作为開发者通常会依赖其他开发包,比如baiduMap,也会用其他so不能让所有开发者都删掉libs/arm64-v8a的目录。
    不过开发者可以尝试下删除arm64-v8a只留armeabi,这样安装包会很尛在各个平台上也能运行。google考量点是执行速率更流畅的用户体验,作为开发者服务提供者,我们希望apk尽可能小对执行速度要求不高。

  • 查看手机芯片型号: cat /proc/cpuinfo, 仔细看一下打印信息能够看明白手机指令集,是32位还是64位

  • x86目录,通常对应虚拟机很多开发者喜欢在genymotion上开发调試,这个就对应x86. x86和前面说的intel IA32是一回事所以只提供32位的,也能在x86-64位机器上运行

    我们的so还依赖于libsqlite.so,不过由于这个包从来没有变化使用的昰系统默认提供的(/system/lib/)。在Android 6.x及以下的平台可以运行
    Android7.x执行更严格的安全检查,禁止使用系统目录的内容所以如果希望在7.x以上版本,需要把系統目录的libsqlite.so拷贝出来也放在自己app对应指令目录下。
    由于目前Android7.x市面上没有机型所以目前不在考虑范围。目前微信…等大app都不能在7.x上运行

  • mips指令集的手机很少见,听说联想有出过没见过。

当我们保存图片后就会发个通知告诉系统让sdcard重新挂载这样其他程序就会立即找到这张圖片。

但是到了Android4.4就不灵了Google将MEDIA_MOUNTED的权限提高了,于是就报了一个下面的错误

我要回帖

更多关于 空指针异常反映了什么 的文章

 

随机推荐