日期:2014-05-20  浏览次数:20651 次

java新手的小疑问。。。。。。。。。。。。。。。
1.怎样计算一个类占用的内存大小??

2.当用new申请一个大小为0的数数组时,有没有开辟内存呢?

3.try语句块中或者它所调用的方法中是不是一定要包含一个活多个throw语句???

4.如果A方法调用B方法,A方法和B方法都有try catch捕捉 处理异常的语句 当在B方法中出现异常时 是B处理 还是A处理呢?

------解决方案--------------------
1.不是很清楚,建议去看java.lang.Class的API。。
2.肯定有。
3.不一定。如果有exception那自然最好用try catch 。。如果没有,那么try不会捕捉到异常,程序流程继续。
4.先由B的try catch进行处理,如果没有被B捕捉到,throw给A进行处理,A也没处理到就抛给调用A的程序 比如main
------解决方案--------------------
try catch finally 语句块中,在使用了try后 catch和finally语句块至少必须有一个
不一定需要catch语句库
------解决方案--------------------
1.不清楚
2.肯定开辟了内存,你想new之后,肯定会返回一个引用,所以肯定需要为这个引用在占内存分配空间。
至于在堆中开没开辟内存,可以看下面这个例子。

Java code

public class Test {

    public static void main(String[] args)    {
        int a[] = new int[0];
        if ( a == null) {
            System.out.println("null");    
        }
    }
    
}

------解决方案--------------------
探讨
1.怎样计算一个类占用的内存大小??

2.当用new申请一个大小为0的数数组时,有没有开辟内存呢?

3.try语句块中或者它所调用的方法中是不是一定要包含一个活多个throw语句???

4.如果A方法调用B方法,A方法和B方法都有try catch捕捉 处理异常的语句 当在B方法中出现异常时 是B处理 还是A处理呢?

------解决方案--------------------
对于第一个问题我看到一篇帖子:http://blog.csdn.net/hoszb/article/details/5846069
你看下对你有木有帮助。
------解决方案--------------------
Java没有提供现成的函数去计算对象的内存空间,不过可以用大量产生某个对象然后计算平均值的方法近似获得该对象占用的内存。写个例子给你:public class Test{
long f1 = Runtime.getRuntime().freeMemory();
for(int i=0;i<1000;i++)
{
MyObject t = new MyObject(); }
long f2 = Runtime.getRuntime().freeMemory();
System.out.println((f1-f2)/1000);//输出每个对象占用的字节数 } }答案补充 
怎么会没有意义呢?比如说开发一个自动化测试工具,需要分析代码的内存效率。答案补充 
关于用序列化来计算对象的内存大小,很多人都以为这种方法可行,但其实不行。1. jvm的字符编码是Unicode(16位),而序列化输出的文本是ANSI或UTF-8编码(8位),所以这在对象大小的比较上就产生了很大的差别。2. 序列化的结果是以文本的形式记录一个对象的状态,文本是不具有java里面的丰富的类型的,比如说int、long等等,这在内存大小上就会产生重大的差别。比如说一个int,在内存里总是4个字节,而保存到文本后就不一定了,这个数字越大占用的空间就越大(需要更加多的文本字符去记录它)。关于这点你可以自己做个测试,将10000个1序列化和将10000个1000序列化,看看大小相差多少。
------解决方案--------------------
第一个真不知道,哈哈
第二个是肯定的
第三个视情况而定吧
第四个异常谁捕捉谁处理,处理不了就交给上一级处理、、、