在面试客户端测试时,经常会被问到崩溃问题由哪些因素造成,小编整理了以下因素,也作为自己的知识梳理,供小伙伴们参考。
一 哪些因素导致崩溃 😡
-
代码逻辑错误
- 比如说常见的
空指针
(Null Pointer Exception
)导致的崩溃。 数组越界
:访问数组或集合中不存在的索引会导致崩溃。- 类型强制转换错误:将对象强制转换为不兼容的类型会引发异常
- 死循环:代码逻辑出现无限循环,导致耗尽内存,从而导致崩溃
- 比如说常见的
-
多线程问题
- 线程安全问题:在多线程环境中,如果多个线程同时修改同一数据而未加索,可能导致数据不一致或崩溃
UI线程操作
:在非UI线程中更新UI组件会导致崩溃。
-
异常处理不当:比如异常未捕获;或者不合理的错误处理逻辑。
-
常见的异常
:NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常 IllegalArgumentException - 传递非法参数异常 ArithmeticException - 算术运算异常 ArrayStoreException - 向数组中存放与声明类型不兼容对象异常 IndexOutOfBoundsException - 下标越界异常 NegativeArraySizeException - 创建一个大小为负数的数组错误异常 NumberFormatException - 数字格式异常 SecurityException - 安全异常 UnsupportedOperationException - 不支持的操作异常
-
-
内存管理
- 内存不足:比如设备性能较差,往往会出现内存不足;处理大图像未进行合适的压缩可能会导致内存不足。
内存泄漏
:未释放不再使用的对象会导致内存占用不断增加,最终导致崩溃。内存溢出
:当应用尝试使用超过设备可用内存的资源时,会导致崩溃。
-
权限:比如获取读取、写入文件权限、网络权限等
-
第三方库问题
- 有时会出现与第三方库不兼容问题,导致崩溃;或者本地使用的库与第三方库重名也会出现崩溃问题。
- 第三方库可能存在缺陷,从而导致崩溃
-
兼容性问题
- 资源格式不规范问题;未适配对应的资源规格
- 设备兼容性问题,比如最新系统兼容、版本兼容问题
-
网络问题
- 网络请求失败:在进行网络请求时,如果未正确处理异常(如超时、链接失败等),可能导致崩溃。
- 数据解析错误:从服务器接收的数据格式不符合预期,解析时可能会引发崩溃。
-
配置和资源问题
- 错误的配置
- 资源文件缺失等
如果还有其他的崩溃因素,欢迎小伙伴们评论补充。
二 内存泄漏示例展示 ⬇️
在java中,内存泄漏通常指对象仍然被引用,但实际上已经不再需要这些对象,导致无法被垃圾回收,从而占用了系统的内存。一个常见的内存泄漏情况是集合类对象持有对其他对象的引用,但不再需要这些对象时未将引用释放。
import java.util.ArrayList;
import java.util.List;
public class MemoryLeakExample {
private static List<Object> list = new ArrayList<>();
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
Object obj = new Object();
list.add(obj);
}
// 不再需要list中的对象,但是忘记清空list
// list = null; // 修复内存泄漏问题的方法
}
}
在上述示例中,MemoryLeakExample
类创建了一个静态的ArrayList
对象 list,并向其中添加了大量 Object 对象。在循环结束后,尽管 list 对象仍然存在,但实际上不再需要这些 Object 对象。如果在不需要list时不将其清空,就会导致这些Object对象无法被垃圾回收,从而产生内存泄漏。
为了修复这个内存泄漏问题,可以在不再需要list对象时将其设置为null,如下所示:
list = null;
这样做可以使 list 对象及其引用的 Object 对象成为垃圾,从而在下一次垃圾回收时被正确地释放,防止内存泄漏。这种做法有助于释放不再需要的对象,优化内存使用,并减少内存泄漏的风险。