0 0

finally连异常都能覆盖,谁来解释一下3

今天在发现一个问题:
前提:
1. test11是主要方法,test11_1是测试用的。
2. 下面的代码是对实际代码的改写。

问题:
如果test11的finally里面没有抛异常,那么test11_1会捕获除0异常,但是现在test11_1捕获的是nullpoint异常。
为什么?finally能覆盖return,连异常都能覆盖?

public static void test11(){
		try{
			System.out.println("try");
			int i=1/0;
		}
		finally{
			String s = null;
			s.length();
			System.out.println("finally");
		}
		System.out.println("end");
	}
	
	public static void test11_1(){
		try{
			test11();
		}catch(Exception e){
			e.printStackTrace();
		}
	}


问题补充:
lihong11 写道
你只catch了一个异常,你再在test11()方法里catch下,就会捕获到两个异常了,一个是NullPointerException异常,一个是ArithmeticException异常。



在test11里面代码没有catch,是设计的问题。这根catch几个异常貌似没有关系吧?

我们现在只讨论,外部调用的时候,只能捕获finally里的异常?try里的异常为什么没有捕获到?

问题补充:
lihong11 写道
还有就是finally并不会覆盖return,它只是在return之前执行


这里的覆盖应该打上引号“覆盖”。我想表达的是:值被finally里的return替换了。

问题补充:
liruimin 写道
如果要在外部能捕获异常在方法后面加一个throws throwable,将所在的异常都抛到最顶层处理


怎么捕获异常这个明白的。
现在的疑惑就是 try里的异常没有打印出来,为什么?而finally里的异常可以打印?

问题补充:
liruimin 写道
只有try的话没有catch是不会去捕获int i=1/0的异常,系统会忽略这个异常继续执行;final里的String s = null;  s.length();语句有异常,你没有进行任务处理所以系统会自动的抛出,并且程序也结束了, 自然System.out.println("end");  
也不会打印出来了 

按照你的理解就是,如果我的finally里面不出现异常,那么System.out.println("end");
就能继续打印出来?而try里的异常因为没有catch而被系统忽略了?


问题补充:
liruimin 写道
按照你的理解就是,如果我的finally里面不出现异常,那么System.out.println("end");
就能继续打印出来?而try里的异常因为没有catch而被系统忽略了?




对的;也不能说是异常被忽略了,只是没有对这个异常进行处理,程序就继续向下执行


这种情况我有测试过,try里的代码出现异常,没有catch的话会向上抛出异常的,前提是finally里没有异常报错。

我不明白你这里的向下执行是指哪一步。

讨论了这么多,感觉总是在外面打转转,没有切入到本质。本人才疏学浅,恳请大侠来解答

问题补充:
liruimin 写道
这种情况我有测试过,try里的代码出现异常,没有catch的话会向上抛出异常的,前提是finally里没有异常报错。

我不明白你这里的向下执行是指哪一步。

讨论了这么多,感觉总是在外面打转转,没有切入到本质。本人才疏学浅,恳请大侠来解答


这样说吧,try里的东西就是一些产品,里面可能有不合格的,catch等于是一个合格产品的过滤器,如果产品有不合格的,就算流水线上发现了,但是没有设置这个过滤装置要过滤不合格产品,所以产品就是走向出厂的过程。不知道你明白了没有


也就是说有try没有catch只是做个样子,就算有异常,程序也会执行下去的,有对应的catch整个try catch才会有作用的

我们用代码举例子吧,下面是我的假设:
//案例1
for(int i=0;i<1000;i++)
{
     try{
         int i=1/0;
     }catch(Exception e){
         //先不关心catch干什么事情
     }
     System.out.println("ok");
}
//案例2
for(int i=0;i<1000;i++){
    try{
        int i=1/0;
    }
    System.out.println("ok");
}


引用
但是没有设置这个过滤装置要过滤不合格产品,所以产品就是走向出厂的过程

我对你上面这句话的理解就是:加入打印出ok就算是合格产品。
能否认同呢?
2011年12月21日 14:53

9个答案 按时间排序 按投票排序

0 0

这种情况我有测试过,try里的代码出现异常,没有catch的话会向上抛出异常的,前提是finally里没有异常报错。

我不明白你这里的向下执行是指哪一步。

讨论了这么多,感觉总是在外面打转转,没有切入到本质。本人才疏学浅,恳请大侠来解答


这样说吧,try里的东西就是一些产品,里面可能有不合格的,catch等于是一个合格产品的过滤器,如果产品有不合格的,就算流水线上发现了,但是没有设置这个过滤装置要过滤不合格产品,所以产品就是走向出厂的过程。不知道你明白了没有


也就是说有try没有catch只是做个样子,就算有异常,程序也会执行下去的,有对应的catch整个try catch才会有作用的

2012年1月12日 09:17
0 0

这种情况我有测试过,try里的代码出现异常,没有catch的话会向上抛出异常的,前提是finally里没有异常报错。

我不明白你这里的向下执行是指哪一步。

讨论了这么多,感觉总是在外面打转转,没有切入到本质。本人才疏学浅,恳请大侠来解答


这样说吧,try里的东西就是一些产品,里面可能有不合格的,cash等于是一个合格产品的过滤器,如果产品有不合格的,就算流水线上发现了,但是没有设置这个过滤装置要过滤不合格产品,所以产品就是走向出厂的过程。不知道你明白了没有

2012年1月12日 09:14
0 0

按照你的理解就是,如果我的finally里面不出现异常,那么System.out.println("end");
就能继续打印出来?而try里的异常因为没有catch而被系统忽略了?




对的;也不能说是异常被忽略了,只是没有对这个异常进行处理,程序就继续向下执行

2012年1月10日 09:05
0 0

	public static void test11() {
		try {
			System.out.println("try");
			int i = 1 / 0;
		} finally {
			System.out.println("finally");
		}
		System.out.println("end");
	}

	public static void test11_1() {
		try {
			test11();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


没有catch只是说,我对try代码块中的异常不予处理,如果出现异常继续向上抛出。
上面的代码是会捕获到异常的。
try
finally
java.lang.ArithmeticException: / by zero

2012年1月02日 18:37
0 0

只有try的话没有catch是不会去捕获int i=1/0的异常,系统会忽略这个异常继续执行;final里的String s = null;  s.length();语句有异常,你没有进行任务处理所以系统会自动的抛出,并且程序也结束了, 自然System.out.println("end");  
也不会打印出来了 


按照你的理解就是,如果我的finally里面不出现异常,那么System.out.println("end");
就能继续打印出来?而try里的异常因为没有catch而被系统忽略了?

如果给s赋值就行了,程序就会正常执行完

2011年12月23日 09:10
0 0

只有try的话没有catch是不会去捕获int i=1/0的异常,系统会忽略这个异常继续执行;final里的String s = null;  s.length();语句有异常,你没有进行任务处理所以系统会自动的抛出,并且程序也结束了, 自然System.out.println("end");  
也不会打印出来了 

2011年12月22日 12:19
0 0

如果要在外部能捕获异常在方法后面加一个throws throwable,将所在的异常都抛到最顶层处理

2011年12月22日 08:59
0 0

还有就是finally并不会覆盖return,它只是在return之前执行

2011年12月21日 17:01
0 0

你只catch了一个异常,你再在test11()方法里catch下,就会捕获到两个异常了,一个是NullPointerException异常,一个是ArithmeticException异常。

2011年12月21日 16:57

相关推荐

    dotnet C# 在 finally 抛异常会发生什么.rar

    1. **异常覆盖**:如果`finally`块中抛出了新的异常,那么原本在`try`块中抛出的异常会被新异常所覆盖。这意味着原始异常的信息将会丢失,除非在`finally`块内部捕获并重新抛出原始异常。 2. **程序终止**:一旦`...

    finally结构的注意点(一)

    总结一下,`finally` 结构是Java编程中处理异常和确保关键操作执行的重要工具。正确理解其工作原理和使用限制,可以帮助开发者编写更加稳定和高效的代码。在进行异常处理和资源管理时,一定要充分利用 `finally` 的...

    Java finally语句到底是在return之前还是之后执行?

    在Java编程语言中,`finally`语句块是一个非常关键的结构,用于确保特定代码无论在任何情况下(包括异常发生或正常返回)都会被执行。这个特性使得`finally`成为处理资源清理,如关闭文件流、数据库连接等操作的理想...

    异常处理.pdf

    此外,finally块虽然总是被执行,但如果在finally块内部发生异常,则可能导致原本的异常信息被覆盖。 7. 自定义异常:Java允许开发者定义自己的异常类。自定义异常类继承自Exception类或其子类,以表示程序中可能...

    使用异常处理语句需要注意的几个问题

    例如,你不能只有一个`try`而没有`catch`或`finally`来处理异常。 2. **catch 和 finally 的使用**:`catch`可以跟在`try`后面处理特定类型的异常,可以有多个`catch`块,每个块处理不同类型的异常。`finally`块...

    java异常体系结构

    Java提供了try/catch/finally异常处理机制,用于捕获并处理异常情况。try块包含可能抛出异常的代码。如果try块中的代码抛出异常,控制流会立即跳转到对应的catch块,如果没有任何catch块能匹配异常类型,则异常会被...

    Java异常处理-异常处理的方式1

    - 如果所有`catch`块都不能匹配抛出的异常,异常会被提交给调用者,如果调用者也不能处理,程序会终止。 案例分析: - 案例1:读取文件时,如果文件不存在,可以使用`FileNotFoundException`捕获异常。 - 案例2:...

    Java异常处理体系

    在Java编程语言中,异常处理是一项关键特性,用于在...- 避免在finally块中抛出异常,因为它会覆盖try和catch块中的异常信息。 通过对Java异常处理体系的深入理解和应用,开发者可以创建出更加稳定、可靠的软件系统。

    final, finally, finalize的区别

    3. **性能优化**:JVM能对 `final` 变量进行内联优化,这意味着如果一个方法被声明为 `final`,那么它不能被子类覆盖,这有助于提高代码执行效率。 4. **常量**:当用 `final` 声明一个变量并初始化后,这个变量就...

    Java异常学习资料

    - 尽量不要在finally块中放可能会抛出异常的代码,这可能导致原始异常被覆盖。 - 使用具体的异常类型,而不是笼统的`Exception`,使错误处理更精确。 - 记录异常信息,这对于调试和问题追踪至关重要。 通过深入...

    try-catch-finally-return-in-finally.rar_return

    `finally` 块总是会被执行,即使在 `try` 或 `catch` 中已经有一个 `return` 语句,这使得我们可以确保无论发生什么情况,都能执行必要的清理工作并返回一致的结果。 通过分析 `12.5-1.js` 和 `try-catch-finally-...

    java面试题 谈谈final, finally, finalize的区别

    这里的 `finally` 块是确保即使在 `try` 或 `catch` 中发生异常,`finally` 里的代码也能得到执行,这对于资源管理非常重要,如关闭数据库连接、文件流等。 3. `finalize()` 方法: `finalize()` 是一个特殊的...

    Java异常框架设计

    - **避免在finally块中抛出异常**:这可能导致原始异常被覆盖,丢失重要信息。 - **不要滥用异常**:异常不应用于正常的控制流程,而应保留为异常情况的信号。 9. **日志和追踪**:在异常处理中,记录异常信息是...

    java异常处理

    1. 异常处理名词解释: - 异常(Exception):在Java中,异常是程序执行期间发生的不正常事件,它打断了正常的程序流程。 - 捕获(Catching):当异常发生时,程序会尝试通过`try-catch`块来捕获并处理异常。 - ...

    python 实验九 文件与异常

    它们对于任何软件开发者来说都是基础且实用的技能。本实验将引导你深入理解如何在Python中进行文件的读写操作,以及如何有效地处理程序运行时可能出现的异常。 ### 文件操作 1. **打开文件**:Python使用内置的`...

    Java 实例 - Finally的用法源代码-详细教程.zip

    在Java中,异常处理主要通过`try-catch`结构来实现,而`finally`则用于补充异常处理的完整性。当`try`块中的代码抛出一个异常时,`catch`块会捕获这个异常并执行相应的处理逻辑。即使`catch`块没有捕获到异常,`...

    高效java异常处理机制

    finally块中的代码不应抛出新的异常,因为它会覆盖原有的异常信息,使调试困难。 12. **使用 throws 关键字声明异常** 如果方法可能抛出检查型异常,应在方法签名中使用throws关键字声明,让调用者知道需要处理...

    java异常框架处理.pdf

    例如,如果一个请求处理过程中发生了一个低级的异常,Spring允许开发者通过抛出一个自定义的高级异常来覆盖这个低级异常,这样的异常处理链能够更清晰地反应问题所在,并且使得异常处理更加灵活。 在实际开发中,...

    java异常讲解

    自定义异常通常继承自`Exception`类或其子类,并且可以覆盖构造方法来传递更多关于异常的信息。 #### 六、异常处理示例 下面通过一个简单的示例来展示如何使用异常处理机制: ```java public static void main...

    异常处理的解决方案

    尽管可以创建自定义的异常类,但.NET框架已经提供了一系列预定义的异常类来覆盖大多数常见场景。例如: - **`System.Exception`**:所有异常的基础类,通常不建议直接使用。 - **`System.SystemException`**:由...

Global site tag (gtag.js) - Google Analytics