从java中的catch块返回基元数据类型

从java中的catch块返回基元数据类型,java,Java,为了学习的目的,我在玩弄例外,我有一个问题。请参阅下面的代码: public static void main(String[] args) { System.out.print(getNumber()); } public static double getNumber() { double number =10; try { String [] students = {"nick","george"}; System.out

为了学习的目的,我在玩弄例外,我有一个问题。请参阅下面的代码:

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;
}

第一个问题:为什么在这种情况下,主方法的输出将为10

因为您正在尝试访问不可用的值

原因:String[]students={“nick”,“george”}

此处的数组大小为2,您正试图访问第5个元素,如下所示:

  System.out.println(students[5]);  
System.out.println("In catch block "+ number); 
通过调用上述语句,java抛出
ArrayIndexOutOfBoundsException

捕获
ArrayIndexOutOfBoundsException
异常时,将执行catch块中的所有语句

您正在打印数字值,如下所示:

  System.out.println(students[5]);  
System.out.println("In catch block "+ number); 

它将打印10号。

第一个问题:为什么在这种情况下,主方法的输出将是10号

因为您正在尝试访问不可用的值

原因:String[]students={“nick”,“george”}

此处的数组大小为2,您正试图访问第5个元素,如下所示:

  System.out.println(students[5]);  
System.out.println("In catch block "+ number); 
通过调用上述语句,java抛出
ArrayIndexOutOfBoundsException

捕获
ArrayIndexOutOfBoundsException
异常时,将执行catch块中的所有语句

您正在打印数字值,如下所示:

  System.out.println(students[5]);  
System.out.println("In catch block "+ number); 

它将打印
10的数字。

最后
块之前运行
捕获
块。在代码的原始版本中,当发生
返回时,该变量的值仍然是10,因此返回的是10

在代码的第二个版本中,您将返回一个
StringBuffer
,但您正在编辑该
StringBuffer
的内容。因此,尽管您只返回一个
StringBuffer
,但在调用方法看到返回的对象时,它已经被更新了


另一种方式是,在第二种情况下,返回的对象是一个引用,指向堆中的对象;但是在第一种情况下,您实际上返回的是一个值,而不是一个引用。

finally
块之前运行
catch
块。在代码的原始版本中,当发生
返回时,该变量的值仍然是10,因此返回的是10

在代码的第二个版本中,您将返回一个
StringBuffer
,但您正在编辑该
StringBuffer
的内容。因此,尽管您只返回一个
StringBuffer
,但在调用方法看到返回的对象时,它已经被更新了


另一种方式是,在第二种情况下,返回的对象是一个引用,指向堆中的对象;但是在第一种情况下,您实际上返回的是一个值,而不是一个引用。

因为在第一个示例中,您返回的是一个原语,它的返回值已经在堆栈中,并且不能被finally块更改


在第二个示例中,您返回的是一个引用变量,它指向的值可以由finally块更改。

因为在第一个示例中,您返回的是一个原语,其返回值已经在堆栈中,finally块无法更改


在第二个示例中,您正在返回一个引用变量,它指向的值可以由finally块更改。

该方法返回的值设置为它遇到的
return
语句。所以

return number;
表示“记住要返回
数字
变量”,而是表示“计算
数字
变量,并记住结果值以将其用作返回值”。稍后更改
number
变量的内容(在
finally
块中)对方法返回的值没有影响,该值已经确定

我们怎么知道的?因为
return
必须计算表达式(per)。比如说,假设你

return number + 5;
…您不会期望得到
25
,因为您有
10
,点击
return
语句,然后在
finally
块中添加另一个
10
,然后表达式添加了
5
更多,对吗
return
计算表达式并记住作为方法的返回值

在您给出的对象示例中,
finally
块中没有更改返回的值。它仍然只是对对象的引用。您正在更改其引用被返回的对象的状态,但该引用未被更改。如果你换了

number.reverse();


…您将看到,您得到的行为与使用
双精度
时完全相同,因为在这种情况下,您正在更改
数字
中保存的值(对对象的引用),就像使用
数字+=10一样

方法返回的值设置为它遇到的
return
语句。所以

return number;
表示“记住要返回
数字
变量”,而是表示“计算
数字
变量,并记住结果值以将其用作返回值”。稍后更改
number
变量的内容(在
finally
块中)对方法返回的值没有影响,该值已经确定

我们怎么知道的?因为
return
必须计算表达式(根据