从Java中的catch块返回原始数据类型

notArefill

我在玩耍以学习为目的,但我有一个问题。请参见下面的代码:

public static void main(String[] args) {

    System.out.print(getNumber());

}


public static double getNumber() {

    double number =10;

    try {
        String [] students = {"nick","george"};
        System.out.println(students[5]);
    }
    catch (ArrayIndexOutOfBoundsException ex ) {
        System.out.println("In catch block "+ number);
        return number;
    }
    finally {
        number +=10;
        System.out.println("The value is now "+ number);
    }
    System.out.println("hiiiii");
    return number;
}

为什么在这种情况下,main方法的输出将为10,为什么如果我运行相同的示例并返回一个对象,该值将被更改?

public static void main(String[] args) {
    System.out.println("In main  is "+getStringBuffer());
}



public static StringBuffer getStringBuffer() {

    StringBuffer number = new StringBuffer("10");

    try {
        String [] names= {"george" ,"nick"};
        System.out.println(names[5]);
    }

    catch (ArrayIndexOutOfBoundsException ex1) {
        System.out.println("In catch block "+ number);
        return number;
    }

    finally {
    number.reverse();   
        System.out.println("In finally is "+ number);
    }
    System.out.println("hiiii");
    return number;
}
TJ人群

方法返回的值return从遇到语句开始设置所以

return number;

并不表示“记住要返回number变量”,而是表示“评估number变量,并记住将其用作返回值的结果值”。number稍后(在finally块中)更改变量的内容对方法返回的值(已确定)没有影响。

我们怎么知道呢?因为return必须评估表达式(根据JLS的第14.17节)。例如,假设您有

return number + 5;

...您不会期望得到的,25因为您有10,命中该return语句,然后10finally块中添加了另一个,然后表达式又添加了5更多,对吗?return计算表达式并记住该作为方法的返回值。

在您提供的对象示例中,返回finally块中未更改它仍然只是对对象的引用。您正在更改要返回其引用的对象状态,但是该引用没有更改。如果您更换

number.reverse();

number = new StringBuffer();

...您会看到与a完全相同的行为double,因为在这种情况下,就像在使用时一样,您正在更改保存在(对对象的引用)中numbernumber += 10;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Pandas DataFrame中返回具有原始数据类型的元素

来自分类Dev

如何在dapper中返回原始数据类型的元组

来自分类Dev

Java原始数据类型在堆栈还是堆上?

来自分类Dev

如何在Java的原始数据类型定义/写的?

来自分类Dev

Java语言中的原始数据类型

来自分类Dev

了解JavaScript中的原始数据类型

来自分类Dev

PERL中的JSON解码-保持原始数据类型

来自分类Dev

关于C#中的原始数据类型

来自分类Dev

在 Kotlin 中读取原始数据类型值

来自分类Dev

对于Java中的这种情况,为什么原始数据类型比参考数据类型消耗更多的内存?

来自分类Dev

对于Java中的这种情况,为什么原始数据类型比参考数据类型消耗更多的内存?

来自分类Dev

在Java中,为什么String是非原始数据类型?

来自分类Dev

Java中的原始数据类型和可移植性

来自分类Dev

是否可以在Java中创建自己的原始数据类型。像int,float,double

来自分类Dev

我如何将原始数据类型与Java中的泛型区分开?

来自分类Dev

覆盖原始数据类型的转换

来自分类Dev

如何检测原始数据类型?

来自分类Dev

验证原始数据类型

来自分类Dev

Javascript中的Refreence数据类型和原始数据类型

来自分类Dev

使用Laravel中的GuzzleClient从另一个应用程序返回原始数据类型(集合)

来自分类Dev

Drools 中原始数据类型与非原始数据类型的性能

来自分类Dev

无法使用 Scala 从 Cassandra DB 中读取原始数据类型映射中的数据

来自分类Dev

XML模式世界中的黑白原始数据类型和派生数据类型有什么区别?

来自分类Dev

为什么Java在声明原始数据类型时不允许null

来自分类Dev

垃圾收集器如何在Java中用于原始数据类型?

来自分类Dev

Java中原始数据类型的MIN_VALUE和MAX_VALUE

来自分类Dev

具有原始数据类型的Java模板作为C ++模板

来自分类常见问题

如何在C#中创建原始数据类型?

来自分类Dev

如何在HBase中存储原始数据类型并进行检索

Related 相关文章

  1. 1

    在Pandas DataFrame中返回具有原始数据类型的元素

  2. 2

    如何在dapper中返回原始数据类型的元组

  3. 3

    Java原始数据类型在堆栈还是堆上?

  4. 4

    如何在Java的原始数据类型定义/写的?

  5. 5

    Java语言中的原始数据类型

  6. 6

    了解JavaScript中的原始数据类型

  7. 7

    PERL中的JSON解码-保持原始数据类型

  8. 8

    关于C#中的原始数据类型

  9. 9

    在 Kotlin 中读取原始数据类型值

  10. 10

    对于Java中的这种情况,为什么原始数据类型比参考数据类型消耗更多的内存?

  11. 11

    对于Java中的这种情况,为什么原始数据类型比参考数据类型消耗更多的内存?

  12. 12

    在Java中,为什么String是非原始数据类型?

  13. 13

    Java中的原始数据类型和可移植性

  14. 14

    是否可以在Java中创建自己的原始数据类型。像int,float,double

  15. 15

    我如何将原始数据类型与Java中的泛型区分开?

  16. 16

    覆盖原始数据类型的转换

  17. 17

    如何检测原始数据类型?

  18. 18

    验证原始数据类型

  19. 19

    Javascript中的Refreence数据类型和原始数据类型

  20. 20

    使用Laravel中的GuzzleClient从另一个应用程序返回原始数据类型(集合)

  21. 21

    Drools 中原始数据类型与非原始数据类型的性能

  22. 22

    无法使用 Scala 从 Cassandra DB 中读取原始数据类型映射中的数据

  23. 23

    XML模式世界中的黑白原始数据类型和派生数据类型有什么区别?

  24. 24

    为什么Java在声明原始数据类型时不允许null

  25. 25

    垃圾收集器如何在Java中用于原始数据类型?

  26. 26

    Java中原始数据类型的MIN_VALUE和MAX_VALUE

  27. 27

    具有原始数据类型的Java模板作为C ++模板

  28. 28

    如何在C#中创建原始数据类型?

  29. 29

    如何在HBase中存储原始数据类型并进行检索

热门标签

归档