return的位置\允许return出现的位置(能否同时出现) | return | return | return |
catch | √ | √ | |
finally | √ | ||
finally后 | √ |
1.finally块在return语句执行之后,return语句返回之前执行
2.finally块中的return语句返回结果会覆盖try块的return语句返回结果
即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
3.finally块中的return语句返回结果会覆盖catch块中的return语句返回结果
即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
4.try块中发生异常,try块中异常语句后的内容不会执行(return语句自然不会执行),执行的是捕获到异常的catch语句块和finally语句块
5.如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变
对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
6.try中发生异常时,return语句写在catch块中
try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
7.finally语句一定会被执行吗?
当程序进入try语句之前就出现异常时,会直接结束
try语句块中有强制退出时也不会执行finally语句块中的代码
package com.atdc.finallyAndReturn;
/*
* @Author: guozhenran
* @Date: 2023/4/25 10:07
* @Description: finally块在return语句执行之后,return语句返回之前执行
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func() {
int a = 10;
try {
System.out.println("try中的代码块");
a += 10;
return a;
} catch (Exception e) {
System.out.println("catch中的代码块");
} finally {
System.out.println("finally中的代码块");
a += 10;
if (a > 10) {
System.out.println("a > 10," + "a=" + a);
}
a += 10;
}
System.out.println("haha");//如果catch中添加了【return a += 1000;】,这里会报错:Unreachable statement
return a;
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:23
* @Description: finally块中的return语句返回结果会覆盖try块的return语句返回结果
* 即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
*/
public class Demo02_1 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a += 10;
return a;
}catch (Exception e){
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
a += 10;
if(a > 10){
System.out.println("a>10," + "a=" + a);
}
a += 10;
return a;
}
}
}
package com.atdc.finallyAndReturn;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:31
* @Description: finally块中的return语句返回结果会覆盖try块的return语句返回结果
* * 即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
*/
public class Demo02_2 {
public static void main(String[] args) {
System.out.println(getMap());
}
public static Map<String,String> getMap(){
Map<String,String> map = new HashMap<>();
map.put("KEY","INIT");
try{
map.put("KEY","try");
return map;
}catch (Exception e){
e.printStackTrace();
map.put("KEY","catch");
}finally {
map.put("KEY","finally");
map = null;
return map;
}
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:46
* @Description: finally块中的return语句返回结果会覆盖catch块中的return语句返回结果
* 即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
*
* try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
* 对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
public class Demo03_1 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a = a /0;
a += 10;
return a ;
}catch (Exception e){
System.out.println("catch中的代码块");
a += 10;
return a;
}finally {
System.out.println("finally中的代码块");
a += 10;
if (a > 10){
System.out.println("a > 10, a = "+a);
}
a += 10;
return a;
}
// System.out.println("hahaha");//报错,Unreachable statement
// return a += 10000;报错,Unreachable statement
}
}
package com.atdc.finallyAndReturn;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:51
* @Description: finally块中的return语句返回结果会覆盖catch块中的return语句返回结果
* 即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
*
* try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
public class Demo03_2 {
public static void main(String[] args) {
System.out.println(getMap());
}
public static Map<String, String> getMap() {
Map<String, String> map = new HashMap<>();
map.put("KEY", "INIT");
try {
map.put("KEY", "try");
String s = null;
System.out.println(s.charAt(0));
return map;
} catch (Exception e) {
e.printStackTrace();
map.put("KEY", "catch");
return map;
} finally {
map.put("KEY", "finally");
map.remove("KEY");
map.put("KEY", "finally2");
map = null;
System.out.println(map);
return map;
}
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:28
* @Description: 如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变
* 对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
public class Demo04_1 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a += 10;
return a;
}catch (Exception e){
e.printStackTrace();
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
a += 10;
if(a > 10){
System.out.println("a > 10,a="+a);
}
a += 10;
}
return a;
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:31
* @Description: 如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
import java.util.HashMap;
import java.util.Map;
public class Demo04_2 {
public static void main(String[] args) {
System.out.println(getMap());
}
public static Map<String,String> getMap(){
Map<String,String> map = new HashMap<>();
map.put("KEY","INIT");
try{
map.put("KEY","try");
return map;
}catch (Exception e){
e.printStackTrace();
map.put("KEY","catch");
}finally {
map.put("KEY","finally");
map = null;
}
map.put("KEY", "hahaha");
return map;
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:43
* @Description: try块中发生异常,try块中异常语句后的内容不会执行(return语句自然不会执行),执行的是捕获到异常的catch语句块和finally语句块
*/
public class Demo05 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func() {
int a = 10;
try {
System.out.println("try中的代码块");
a = a / 0;
a += 10;
return a;
} catch (Exception e) {
a += 10;
System.out.println("catch中的代码块");
} finally {
System.out.println("finally中的代码块");
a += 10;
if (a > 20) {
System.out.println("a > 20,a =" + a);
}
a += 10;
}
System.out.println("hahaha");
return a;
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:46
* @Description: try中发生异常时,return语句写在catch块中
* try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
* 对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
public class Demo06_1 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a = a /0;
a += 10;
return a ;
}catch (Exception e){
System.out.println("catch中的代码块");
a += 10;
return a;
}finally {
System.out.println("finally中的代码块");
a += 10;
if (a > 10){
System.out.println("a > 10, a = "+a);
}
a += 10;
}
// System.out.println("hahaha");//报错,Unreachable statement
// return a += 10000;报错,Unreachable statement
}
}
package com.atdc.finallyAndReturn;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:51
* @Description: try中发生异常时,return写在catch语句中
* try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
* 对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
* (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
*/
public class Demo06_2 {
public static void main(String[] args) {
System.out.println(getMap());
}
public static Map<String, String> getMap() {
Map<String, String> map = new HashMap<>();
map.put("KEY", "INIT");
try {
map.put("KEY", "try");
String s = null;
System.out.println(s.charAt(0));
return map;
} catch (Exception e) {
e.printStackTrace();
map.put("KEY", "catch");
return map;
} finally {
map.put("KEY", "finally");
map.remove("KEY");
map.put("KEY", "finally2");
map = null;
System.out.println(map);
}
}
}
package com.atdc.finallyAndReturn;
/**
* @Author: guozhenran
* @Date: 2023/4/25 10:49
* @Description: finally语句一定会被执行吗?
* 当程序进入try语句之前就出现异常时,会直接结束
* try语句块中有强制退出时也不会执行finally语句块中的代码
*/
public class Demo07 {
public static void main(String[] args) {
int a = 10;
try{
System.out.println("try block");
System.exit(0);
}catch (Exception e){
System.out.println("catch block");
}finally {
System.out.println("finally block");
}
}
}
参考: