从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
必须计算表达式(根据