finally感觉不用也可以?

中才德创 2016-04-16 09:51:41
教科书上说,finally是保证在异常发生后,仍旧必须要执行的语句。
下面的例子输出:


按照上面打印的信息看,finally里面的语句完全可以放到System.out.println("测试函数结束!")地方!
public class C65
{
public void test() {
System.out.println("测试函数开始!");

try {
int x[] = new int[2];
System.out.println("int[2]=" + x[2]);
System.out.println("try块语句执行结束!");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
System.out.println("catch块语句执行结束!");
} finally {
System.out.println("finally块语句执行结束!");
}

System.out.println("测试函数结束!");
}
}
...全文
613 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
白墨MO 2019-05-08
  • 打赏
  • 举报
回复
引用 17 楼 HawkOfWinter 的回复:
[quote=引用 16 楼 chenshuozhong 的回复:] finally内的代码是确保在离开try,catch代码块时会被调用,不要理解成异常发生才会调用. 如果你的代码非常简单,所有可能的错误你都能预知到,并且都catch了,那么可以放在System.out.println("测试函数结束!")前,运行结果是一样的.但是很多时候错误都无发预知的
其实,根本原因是try中若抛出异常,就导致finally外面的没有执行了。[/quote]豁然开朗!
PrayLife 2016-04-19
  • 打赏
  • 举报
回复
finally不管怎么样都会执行,算是一种防止异常下的处理措施
Goskalrie 2016-04-19
  • 打赏
  • 举报
回复
Java异常处理流程:http://blog.csdn.net/goskalrie/article/details/50802871 a) 如果程序中产生了异常,那么会自动的由JVM根据异常的类型实例化一个指定异常类的对象; b) 如果程序中没有任何异常处理操作,则这个异常类的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是将异常信息输出,而后中断程序执行; c) 如果程序中存在了异常处理,会由try语句捕获产生的异常对象; d) 与try之后的每一个catch进行匹配,如果匹配成功,则使用指定的catch进行处理,如果没有匹配成功,则向后面的catch继续匹配,如果没有任何的catch匹配成功,将交给JVM执行默认处理; e) 不管是否有异常都会执行finally程序,如果此时没有异常,执行完finally会继续执行程序中的其他代码,如果此时有异常没能够处理(没有一个catch可以满足)。那么也会执行finally,但是执行完finally后,将交给JVM执行默认处理。 楼主的测试代码中没有异常产生,楼主在try块中手工抛出个异常或是产生一个异常(1/0)试一下就发现怎么回事了。
中才德创 2016-04-18
  • 打赏
  • 举报
回复
引用 16 楼 chenshuozhong 的回复:
finally内的代码是确保在离开try,catch代码块时会被调用,不要理解成异常发生才会调用. 如果你的代码非常简单,所有可能的错误你都能预知到,并且都catch了,那么可以放在System.out.println("测试函数结束!")前,运行结果是一样的.但是很多时候错误都无发预知的
其实,根本原因是try中若抛出异常,就导致finally外面的没有执行了。
QCkiss 2016-04-18
  • 打赏
  • 举报
回复
这已是可以放弃了,回去搬砖吧
chenshuozhong 2016-04-18
  • 打赏
  • 举报
回复
finally内的代码是确保在离开try,catch代码块时会被调用,不要理解成异常发生才会调用. 如果你的代码非常简单,所有可能的错误你都能预知到,并且都catch了,那么可以放在System.out.println("测试函数结束!")前,运行结果是一样的.但是很多时候错误都无发预知的
nwpucyp 2016-04-18
  • 打赏
  • 举报
回复
finally可以帮助你在有异常发生时回收资源啊!比如数据库的连接的回收。要不然你自己还要实现这样的逻辑…现在有finally这个机制帮你做了
奄灬苟且偷生 2016-04-18
  • 打赏
  • 举报
回复
我感觉JAVA不用也可以
冰思雨 2016-04-18
  • 打赏
  • 举报
回复
你在第8行添加一句 : throw new RuntimeException("Oh, My god ."); 之后运行一下代码,就知道到底有什么作用了。
小灰狼 2016-04-18
  • 打赏
  • 举报
回复
必要性确实不是十分强,毕竟某些语言没有提供 finlly 语句,也可以处理类似逻辑 不过,finally语句使某些逻辑变得简单,比如: InputStream is = null; try{ is = new FileInputStream("....."); // 其它操作文件流的代码 ...... // 这里抛出空指针异常 ...... }catch(IOException ioEx){ // 处理IO异常 } finally{ if(is != null){ try{ is.close(); } catch(IOException ex){} } } 如果只捕捉 IOException,而运行时抛出的异常没有捕捉到,则还可以由 finally 上一层保险,确保资源被释放 另一种情况,如果异常不是需要自己处理,而是交给调用者,则可以有 try ... finally,不必有 catch,而是在方法中声明抛出: public void loadConfig() throws IOException { InputStream is = null; try{ is = new FileInputStream("配置文件.properties"); // 读取配置文件信息的代码 }finally{ if(is != null){ try{ is.close(); } catch(IOException ex){} } } } 最后,如果 try 中的逻辑很复杂,中间随时有返回的代码,则加上 finally 可以确保资源被释放: public int getXXXStatus(){ InputStream is = null; try{ is = new FileInputStream("......"); if(.....) return 1; ..... if(....){ if(....) return 2; else return 3; }else{ ..... if(....) return 4; else return 5; } return 0; }finally{ if(is != null){ try{ is.close(); } catch(IOException ex){} } } }
中才德创 2016-04-16
  • 打赏
  • 举报
回复
现在明白多了:
1)在try或catch里执行了throw,那么finally仍旧执行,但后面的语句都不会执行了。


2)如果没有throw,没什么区别。
中才德创 2016-04-16
  • 打赏
  • 举报
回复
[quote=引用 3 楼 hhv_01 的回复:] 如果把异常都catch掉了就没问题,但是如果需要抛出异常就不一样了,下面的代码木有编译错误:/quote] 语文表达能力欠缺,都不知你想说什么。
飏飏一蝶 2016-04-16
  • 打赏
  • 举报
回复
sorry,上面说法有误 应该这样理解,finally是可能/没发生异常时都必须做的事情 如果不需要捕捉异常,也就不需要finally了
飏飏一蝶 2016-04-16
  • 打赏
  • 举报
回复
引用 2 楼 HawkOfWinter 的回复:
[quote=引用 1 楼 qq118194716 的回复:] 你理解错了finally的意图了,完全是绕过去了 finally是保证try里面的语句发不发生异常都必须执行 和try以外的语句没关系
不是的,我将它挪到外面,也能达到“try里面的语句发不发生异常都必须执行”的效果。 所以,我的核心想法是,finally必要性没看到。[/quote] try里面发生异常,除了finally里面的句子会执行,之后方法里的所有句子都不会执行了,直接跳出了 这就是finally的作用
北极熊丶 2016-04-16
  • 打赏
  • 举报
回复
个人理解,一般catch到异常要抛出异常终止程序,出错了后面代码也没有执行的必要性了,比如throw new RuntimeException();抛出异常,finally里面的代码还是会执行的。就像jdbc,一般关闭资源都写到finally中,程序出错还是会关闭资源,否则后面代码可能不会执行造成资源浪费;
HerveyHall 2016-04-16
  • 打赏
  • 举报
回复
如果把异常都catch掉了就没问题,但是如果需要抛出异常就不一样了,下面的代码木有编译错误:
public class TestFinally {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		try{
			throw new Exception("My Exception");
		}catch(Exception e){
			//throw e;
		}finally{
			System.out.println("Finally block done.");
		}
		System.out.println("Try block done.");
	}

}
但是这样:

public class TestFinally {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		try{
			throw new Exception("My Exception");
		}catch(Exception e){
			throw e;
		}finally{
			System.out.println("Finally block done.");
		}
		System.out.println("Try block done.");//Error
	}

}
就报错了:
Description        	Resource       	Path        	Location	Type
Unreachable code	TestFinally.java	/Demo/src/other	line 14	Java Problem
中才德创 2016-04-16
  • 打赏
  • 举报
回复
引用 1 楼 qq118194716 的回复:
你理解错了finally的意图了,完全是绕过去了 finally是保证try里面的语句发不发生异常都必须执行 和try以外的语句没关系
不是的,我将它挪到外面,也能达到“try里面的语句发不发生异常都必须执行”的效果。 所以,我的核心想法是,finally必要性没看到。
飏飏一蝶 2016-04-16
  • 打赏
  • 举报
回复
你理解错了finally的意图了,完全是绕过去了 finally是保证try里面的语句发不发生异常都必须执行 和try以外的语句没关系
家里敷泥呀 2016-04-16
  • 打赏
  • 举报
回复
引用 8 楼 HawkOfWinter 的回复:
现在明白多了: 1)在try或catch里执行了throw,那么finally仍旧执行,但后面的语句都不会执行了。 2)如果没有throw,没什么区别。
没有throw 也不表示没区别:

	public static void main(String[] args) {
		System.out.println("测试函数开始!");
		try {
			int x[] = null;
			x.toString();
			System.out.println("try块语句执行结束!");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(e.toString());
			System.out.println("catch块语句执行结束!");
		} finally {
			System.out.println("finally块语句执行结束!");
		}

		System.out.println("测试函数结束!");
	}
HerveyHall 2016-04-16
  • 打赏
  • 举报
回复
引用 7 楼 HawkOfWinter 的回复:
[quote=引用 3 楼 hhv_01 的回复:] 如果把异常都catch掉了就没问题,但是如果需要抛出异常就不一样了,下面的代码木有编译错误:/quote] 语文表达能力欠缺,都不知你想说什么。
exception意思是“异常”,但是也有翻译成“违例”的; catch是捕获,throw是抛出; 有编译错误的话抛出error而不是exception。。。 话说这些关键字翻译出来确实挺奇怪的说

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧