【Java基础篇】 try中return A,catch中return Bfinally中return C,最终返回值是什么?

2024-01-09 02:01:59

在这里插入图片描述


??典型解析


最终的返回值将会是C


因为 finally块总是在 trycatch 块之后执行,无论是否有异常发生。如果finally块中有一个return语句,它将夏盖try块和catch块中的任何return语句。


//无异常情况
public static string getValue() {
	try {
		return "A" ;
	} catch (Exception e) {
		return "B" ;
	} finally {
		return "C" ;
	}
}

//有异常情说
public static string getValue() {
	try {
		System.out.println( 1 / 0 );
		return "A" ;
	} catch (Exception e) {
		return "B" ;
	} finally {
		return "C" ;
	}
}

所以在这种情况下,无论 trycatch 块的执行情况如何,finally 块中的 return C ;总是最后执行的语句并目其返回值将是整个代码块的返回值。


这个问题还有一个孪生问题,那就是如下代码得到的结果是什么:


public static void getValue() {
	
	int i = 0;
	
	try {
		i = 1;
	} catch (Exception e) {
		i = 3;
	} finally {
		i = 5;
	}
	System.out.println(i);
}

原理和上面的是一样的,最终输出内容为5。


??拓展知识仓


??finally 和 return 的关系


很多时候,我们的一个方法会通过return返回一个值,那么如以下代码:


public static int getValue()  {

	int i = 1;
	
	try {
		++i;
		return i;
	}  catch (Exception e)  {
		i = 66;
	} finally {
		i = 100;
	}
	return i;
}

这人代码得到的结果是2,try-catch-finally的执行顺序是try->finally或者try-catch-finally,然后在护行每一个代码块的过程中,如果遇到return那么就会把当前的结果暂存,然后再执行后面的代码块,然后再把之前暂存的结果返回回去。


所以以上代码,会先把 ++i 即 2 的结果暂存,然后执行 i=100,接着再把 2 返回。


但是,在执行后续的代码块过程中,如果遇到了新的 return ,那么之前的暂存结果就会被覆盖。如:


public static int getValue() {
	
	int i = 1;
	
	try {
		i++;
		return i;
	} catch (Exception e)  {
		i = 66;
	} finally {
		i = 100;
		return i;
	}
}

以上代码方法得到的结果是100,是因为在finally 中遇到了一个新的 return ,就会把之前的结果给覆盖掉。


如果代码出现异常也同理:


public static int getValue() {
	
	int i = 1;
	
	try {
		++i;
		System.out.println( 1 / 0 );
		return i;
	} catch (Exception e)  {
		i = 66;
	} finally {
		i = 100;
		return i;
	}
}

在try中出现一个异常之后,会执行 catch,在执行 finally ,最终得到 100。如果没有finally :


public static int getValue() {
	
	int i = 1;
	
	try {
		i++;
		System.out.println( 1 / 0 );
		return i;
	} catch (Exception e)  {
		i = 66;
		return i;
	}
}

那么得到的结果将是66。


所以,如果 finally 块中有 return 语句,则其返回值将是整个 try-catch-finally 结构的返回值。如果 finally 块中没有 return 语句,则 trycatch 块中的 return 语句 (取决于哪个执行了) 将确定最终的返回值。


注意:我在上面的示例代码中一会使用 ++i,一会使用 i++,这个我要给大家回顾一下,在编程中,对于这个变量自身来讲,前++ 后 ++ 是没有任何区别的。总结如下:

(1)对于变量自身来说,无论将++放在变量名的前面或者后面都是先数值的加1效果,实际上是等价的


(2) a++ 表示先让 a 的数值作为整个表达式的结果,然后再让a自身的数值加1; ++a 表示先让a自身的数值加1,然后再作为整个表达式的结果


?? final、finally、finalize有什么区别


final、finally、finalize有什么区别? 这个问题就像周杰、周杰伦和周星驰之间有啥关系的问题一样.其实没啥关系,放在一起比较无非是名字有点像罢了。


final、finally和finalize是Java中的三个不同的概念:
  • final: 用于声明变量、方法或类,使之不可变、不可重写或不可继承

  • finally: 是异常处理的一部分,用于确保代码块 (通常用于资源清理) 总是执行

  • finalize: 是Obiect类的一个方法,用于在对象被垃圾回收前执行清理操作,但通常不推荐使用

??final


final是一个关键字,可以用来修饰变量、方法和类。分别代表着不同的含义。


final变量: 即我们所说的常量,一旦被赋值后,就不能被修改。


final int x = 100:
// x = 200;// 编译错误,不能修改final变量的值
public static final string AUTHOR_NAME = "Xinbaobaba":

final方法: 不能被了类重写


 public final void show()  {
		//.........
 }

final类: 不能被继承


public final class MyFinalClass  {
	//......
}

??finally


finally是一个用于异常处理,它和try、catch块一起使用。无论是否捕获或处理异常,finally块中的代码总是执行(程序正常执行的情况) 。通常用于关闭资源,如输入/输出流、数据库连接等。


try {
	//可能产生异常的代码
} catch (Exception e)  {
	// 异常处理代码
} finally {
	// 清理代码,总是执行
}

?? finalize


finalizeObject 类的一个方法,用于垃圾收集过程中的资源回收。在对象被垃圾收集器回收之前 finalize 方法会被调用,用于执行清理操作(例如释放资源)。但是,不推荐依赖finalize方法进行资源清理,因为它的调用时机不确定且不可靠。


protected void finalize() throws Throwable {
	//  在对象被回收时执行清理工作
}

文章来源:https://blog.csdn.net/Java_Yangxiaoyuan/article/details/135379110
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。