一天一个知识点(二)

一天一个知识点,第二弹! 首先,让我们来看一道题

下列哪些语句关于内存回收的说明是正确的? (b)

A、 程序员必须创建一个线程来释放内存

B、 内存回收程序负责释放无用内存

C、 内存回收程序允许程序员直接释放内存

D、 内存回收程序可以在指定的时间释放内存对象

答案选B,那么其他答案说的都是什么呢?让我们来看一下android开发中的内存回收。


以下是一篇关于内存回收机制的文章,原文链接http://www.cnblogs.com/bastard/archive/2012/08/17/2644169.html

这篇文章讨论比较详细,内容充实,是从默认回收和内核级别回收两方面进行分析的。


扫描二维码关注公众号,回复: 1215248 查看本文章

关于之前的那道题,我们可以看到四个选项,除了B选项之外,其它选项都是说明我们可以主动选择释放内存,不管是创建线程也好,还是调用函数也好。然而需要注意,我们是不能够主动释放内存的。java的GC回收是完全自动的,没有提供相关api手动回收,所有的内存分配和回收权限都在jvm,不在开发人员手里。基于这一点,这道题就很明显选择B了。


说到了内存回收,不得不提到一个词,内存泄漏。那么内存泄漏是什么呢?简单的说一下。

同样,附上一篇网上的文章,关于内存泄漏 http://www.cnblogs.com/yejiurui/archive/2013/02/23/2923418.html

内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。


Android应用内存泄漏的的原因有以下几个:

1查询数据库后没有关闭游标cursor  
2 构造Adapter时,没有使用 convertView 重用 
3 Bitmap对象不在使用时调用recycle()释放内存 
4 对象被生命周期长的对象引用,如activity被静态集合引用导致activity不能释放


内存泄漏的发现:
通过DDMS中的heap工具,去发现是否有内存溢出。

内存泄漏如何解决:
通过内存分析工具 MAT(Memory Analyzer Tool),找到内存泄露的对象


接下来再看一题

下面异常是属于Runtime Exception 的是(abcd)(多选)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException


在开发过程中,我见过的最多的异常就是空指针异常了,那么其他的三个异常又是什么呢?

这里有一篇异常分析的文章,作者看来还是不错的http://www.open-open.com/lib/view/open1345378428626.html


ArithmeticException(除数为0的异常), BufferOverflowException(缓冲区上溢异常), BufferUnderflowException(缓冲区下溢异常), IndexOutOfBoundsException(出界异常), NullPointerException(空指针异常), EmptyStackException(空栈异常), IllegalArgumentException(不合法的参数异常), NegativeArraySizeException(创建一个大小为负数的数组错误异常), NoSuchElementException, SecurityException(安全异常), SystemException, UndeclaredThrowableException


1. java.lang.NullPointerException
  异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)
2. java.lang.ClassNotFoundException  

异常的解释是"指定的类不存在"。
3. java.lang.ArithmeticException  

这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常。
4. java.lang.ArrayIndexOutOfBoundsException
  异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
5. java.lang.IllegalArgumentException
  这个异常的解释是"方法的参数错误",比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
6. java.lang.IllegalAccessException
  这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常


附上文章链接http://blog.csdn.net/jaycee110905/article/details/45154039

一般面试中java Exception(RuntimeException )是必会被问到的问题
常见的异常列出四五种,是基本要求。更多的。。。。需要注意积累了
 
常见的几种如下:
 
1、NullPointerException - 空指针引用异常
2、ClassCastException - 类型强制转换异常。
3、IllegalArgumentException - 传递非法参数异常。
4、ArithmeticException - 算术运算异常
5、ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
6、IndexOutOfBoundsException - 下标越界异常
7、NegativeArraySizeException - 创建一个大小为负数的数组错误异常
8、NumberFormatException - 数字格式异常
9、SecurityException - 安全异常
10、UnsupportedOperationException - 不支持的操作异常


第二弹就先写到这里,主要是针对Android面试中常遇到的一些问题,有些知识点是需要大量的时间和实践才能理解的,不是一天能够看完的。那些内容,还需要我们抽出时间来慢慢补足。



猜你喜欢

转载自blog.csdn.net/kongou/article/details/51474739