`

[#0x0021] throw的屏蔽作用

    博客分类:
  • Java
阅读更多

  在其所在的块内(即{}之内,如方法body、if {...}等)(只是单纯的一对{}不能称为块),throw语句可以屏蔽其后的语句(即在块内,该throw语句后面不能再写其他语句),但在块之外,还是可以写其他的语句的。如:

public class ExceptionTest
{
	private static void func() throws Exception
	{
		throw new Exception();
		//System.out.println("Threw Exception"); //error
	}

	private static void func2() throws Exception
	{
		boolean tag = true;
		
		if (tag)
		{
			throw new Exception();
			//System.out.println("Threw Exception"); //error
		}
		System.out.println("No Exception"); //pass //Mark No.3
	}

	public static void main(String[] args)
	{
		try
		{
			func2(); //Mark No.1
			throw new Exception(); //Mark No.2: direct throw in try
		}
		catch (Exception e)
		{
			System.out.println("Caught Exception");
		}
		
		System.out.println("Continue"); //Mark No.4
	}
}

//output:
/*
	Caught Exception
	Continue
*/

 

  如果不是直接在try中抛出异常(Mark No.2),而是调用会抛出异常的方法(Mark No.1),一旦throw语句执行,则包含该throw语句的函数(如本例的func2())直接退出,后续的语句都不执行(如Mark No.3处就没有运行)。而处理异常的函数(如本例的main())依旧是顺序运行,不会有什么影响,后续的语句继续运行(如Mark No.4处照常运行)。

 

 

2011-10-27 补充:多个throw的覆盖作用

  如果你 throw 了一个 Exception,紧接着后面的 catch/finally 也 throw 了一个 Exception,那么,只有最后抛出的 Exception 才能被外围捕捉,前面 throw 的 Exception 就被覆盖掉了。

 

  一个典型的可能的例子是:

try {
	// 读文件
} finally { 
	if (io != null) {
		io.close();
	}
}

如果读文件时出了 FileNotFoundException,而不巧 io.close() 也出了 IOException,那么外围只能捕捉到 IOException,而真实的原因 FileNotFoundException 却捕捉不到。

 

  《Practical Java》上说可以用一个Collection来保存Exception,最后 throw 出一个 AllException(Collection<Exception> c) 这样的异常出来。但是感觉太麻烦了,估计很少有人这么做。这里记录一下,也只能说是为调试提供一种可能的异常判断思路,真要遇上奇葩的情况,还是自求多福吧……

分享到:
评论

相关推荐

    C# throw詳解

    ### C#中的throw语句详解 #### 一、throw语句概述 在C#编程语言中,`throw`语句是一种重要的异常处理机制的一部分。它主要用于在程序运行时发生异常情况时,显式地抛出一个异常对象。`throw`语句常常与`try`、`...

    Java的throw和return

    ### Java的throw和return 在Java编程语言中,`throw`和`return`是两个非常重要的关键字,它们分别用于处理异常和返回方法的结果。本文将详细介绍这两个关键字的用法、特点以及它们与`finally`块之间的关系。 #### ...

    throws与throw区别

    本文将深入探讨“throws”与“throw”两个关键字的区别,以及它们在Java异常处理机制中的作用。 ### throws关键字 `throws`关键字主要用于方法签名中,用于声明一个方法可能会抛出的异常类型。当一个方法内部可能...

    throws与throw的区别

    throw的主要作用是明确地抛出一个异常,告訴调用者该方法已经抛出了一个异常。例如,`if (a != b) throw new Exception3("自定义异常");`,這裡的throw语句抛出了一个Exception3异常。 throws和throw的區別 throws...

    Java中throws和throw的区别讲解.docx

    通过以上介绍,我们可以看出`throw`和`throws`虽然都与异常处理有关,但它们的作用和用法是不同的。理解这两者之间的区别对于编写健壮且易于维护的Java代码至关重要。正确地使用`throw`和`throws`不仅可以帮助我们更...

    java throw抛出异常实例二

    下面我们将详细讨论`throw`关键字的使用以及它在异常处理中的作用。 首先,异常在Java中是通过类来表示的,这些类都是`java.lang.Throwable`的子类,如`Exception`和`Error`。`Exception`是程序可以预见并通常应该...

    throw关键字

    Java中的throw与throws的关键字的使用

    C#屏蔽WIN功能键

    throw new Exception("UnhookWindowsHookEx failed."); } ``` #### 四、拦截特定按键 在`KeyBoardHookProc`方法中,我们可以通过检查`vkCode`字段来判断是否是需要拦截的按键,并返回特定值来阻止默认行为: ```...

    21.javathrow抛出异常对象.zip

    21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21....

    WEB开发 之 JavaScript 错误 - Throw、Try 和 Catch.docx

    WEB开发之JavaScript错误-Throw、Try和Catch JavaScript错误处理是WEB开发中的一个重要方面。在JavaScript中,错误可能来自语法错误、拼写错误、服务器或用户的错误输出等多种原因。因此,了解如何正确地处理错误是...

    Java异常处理的四大金刚:try、catch、finally和throw的深度解析

    ### Java异常处理的四大金刚:try、catch、finally和throw的深度解析 #### Java异常处理概述 异常处理机制是程序设计中的一个重要组成部分,它能够帮助程序员有效地管理程序运行过程中可能出现的各种错误情况。...

    Java软件开发实战 Java基础与案例开发详解 10-4 使用throw和throws引发异常 共5页.pdf

    ### Java软件开发实战:使用throw和throws引发异常 #### 1. Java异常处理基础 在Java编程中,异常处理是一项非常重要的技术,用于处理程序运行过程中可能出现的各种异常情况。异常处理主要包括异常的捕获、处理...

    2023级java语言实验报告(理工学院)(6).docx

    根据给定的文件信息,本篇内容将围绕Java异常处理这一主题进行展开,涉及的知识点主要包括try-catch结构、throw和throws的使用以及如何通过一个具体的案例来加深对这些概念的理解。 ### 一、Java异常处理概述 Java...

    简单的try-throw-catch源码

    一个非常简单的try-throw-catch源码

    浅谈C++函数声明后面加throw()的作用(必看)

    C++里面为什么有时候在函数声明的时候在后面加throw()关键字? 解释: C++函数后面加关键字throw(something)限制,是对这个函数的异常安全作出限制;这是一种异常规范,只会出现在声明函数时,表示这个函数可能抛出...

    详解Java异常处理中throw与throws关键字的用法区别

    在Java中,异常处理主要通过try-catch-finally结构来实现,而在异常处理中,`throw` 和 `throws` 关键字起着关键作用。它们虽然都与异常抛出有关,但使用方式和含义有所不同。 `throw` 关键字用于在代码中明确地抛...

    web的gzip解压代码

    response.ok) throw new Error('Network response was not ok'); return response.arrayBuffer(); }) .then(arrayBuffer =&gt; { const blob = new Blob([arrayBuffer], { type: 'application/gzip' }); const ...

    java throw抛出异常实例一

    `throw`关键字是Java中用于显式抛出异常的关键字。本实例将深入探讨如何使用`throw`来创建和处理自定义异常,以及它在实际编程中的应用。 首先,我们了解异常的基本概念。在Java中,异常是程序执行过程中遇到的不...

    throw的一些用法

    无论是.net还是java,在开发程序时都难免会用到throw关键字,对于初学者一般会认为它与try…catch捆绑在一起,这当然是错误的,事实上,throw的一个最重要的作用就是: 让程序告诉用户一些事情,这些事情一般是开发...

Global site tag (gtag.js) - Google Analytics