首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在"catch"或"finally"范围内的"try"中没有声明变量?

在 "try" 或 "finally" 范围内的 "try" 中,声明变量通常不是必要的。这是因为 "try" 部分的作用是在程序执行过程中捕获可能出现错误的代码。当 "try" 部分中的代码抛出异常时,会跳到相应的 "catch" 语句或 "finally" 语句,而不会让这个异常造成程序崩溃。

在 "try" 部分使用声明的变量,只有在没有抛出异常的情况下,该变量才能正常访问。如果 "try" 部分中的代码抛出异常,那么程序将会跳过所有的 "catch" 语句和 "finally" 语句,从而导致变量无法访问。

然而,如果在 "try" 部分中声明了变量,并在出现异常的情况下抛出该变量,程序仍然可以访问该变量。但是,如果变量被 "finally" 部分中的代码覆盖,那么变量就会被重新分配,导致你获取到的变量值可能不正确或失效。

因此,在 "try" 或 "finally" 范围内的 "try" 中声明变量往往不是必要的。你可以根据实际需求来决定是否需要这样做,但是通常情况下这种做法并不推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于Java异常Exception最常见十大问题1 受检异常 VS 非受检异常2 异常管理最佳实践3 为什么try语句中定义变量不能在catchfinally语句中使用?4 为什么Doubl

Paste_Image.png 2 异常管理最佳实践 如果一个异常能够被正确处理,那么他就该捕获,反之,则该被抛出 3 为什么try语句中定义变量不能在catchfinally语句中使用?...The code does not pass compilation 下面这段代码,string s定义try语句块,然后却在catch语句中使用了s,这段程序是无法通过编译 try {...语句块exception会在哪里被throw出去,比如这个例子,我们知道如果要抛出FileNotFoundException,也是头两句代码,那么如果跑出了异常,异常产生地方,其后代码都不会被执行...这就是为什么try语句中定义变量不能在catchfinally语句中使用。...构造方法只是一种比较特殊方法,所以,自然而来,他也能像其他方法一样抛出异常。 存在这样一种情况,一些对象已经被创建了而且被分配给静态成员变量,但这时构造方法还没有执行。

1.1K41

干货 | Java 不得不知异常和处理详解

方法要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样异常一般是由程序运行环境导致。...//catch可以使用这个块异常参数来获取异常相关信息。异常参数是这个catch局部变量,其它块不能访问。...} 需要注意地方 1、try局部变量catch局部变量(包括异常变量),以及finally局部变量,他们之间不可共享使用。 2、每一个catch块用于处理一个异常。...2、同一trycatchfinally ,如果try抛出异常,且有匹配catch块,则先执行catch块,再执行finally块。...3、同一trycatchfinallytry发生异常,且匹配catch处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者寻找合适catch

99971

Java异常和处理详解

方法要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样异常一般是由程序运行环境导致。...//catch可以使用这个块异常参数来获取异常相关信息。异常参数是这个catch局部变量,其它块不能访问。...} 需要注意地方 1、try局部变量catch局部变量(包括异常变量),以及finally局部变量,他们之间不可共享使用。 2、每一个catch块用于处理一个异常。...2、同一try...catch...finally ,如果try抛出异常,且有匹配catch块,则先执行catch块,再执行finally块。...3、同一try...catch...finallytry发生异常,且匹配catch处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者寻找合适

48921

Java异常详解及如何处理

方法要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样异常一般是由程序运行环境导致。...//catch可以使用这个块异常参数来获取异常相关信息。异常参数是这个catch局部变量,其它块不能访问。...} 需要注意地方 1、try局部变量catch局部变量(包括异常变量),以及finally局部变量,他们之间不可共享使用。 2、每一个catch块用于处理一个异常。...2、同一trycatchfinally ,如果try抛出异常,且有匹配catch块,则先执行catch块,再执行finally块。...3、同一trycatchfinallytry发生异常,且匹配catch处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者寻找合适catch

1.2K50

【转】java异常与try catch finally详解

方法要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样异常一般是由程序运行环境导致。...//catch可以使用这个块异常参数来获取异常相关信息。异常参数是这个catch局部变量,其它块不能访问。...} 需要注意地方 1、try局部变量catch局部变量(包括异常变量),以及finally局部变量,他们之间不可共享使用。 2、每一个catch块用于处理一个异常。...2、同一try...catch...finally ,如果try抛出异常,且有匹配catch块,则先执行catch块,再执行finally块。...3、同一try...catch...finallytry发生异常,且匹配catch处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者寻找合适

79330

try catch finally 实现机制

JVM 如何执行 try - catch 创建一个TryCatchFinallyDemo.java 类,foo()方法声明try-catch block;声明了 handleException...相对于没有try-catch block 代码,下列代码多出了一个Exception Table。...修改返回值示例.png 编译查看字节码: 修改返回值示例字节码.png 通过字节码,我们发现,try语句return块,return 返回变量并不是直接返回 i 值,而是执行finally...块之前把i值存储临时区域,当执行return时直接返回临时区域中值,即使finally语句中把变量 i 值修改了,也不会影响返回值。...可以看到,虽然try-catch blocki值被暂存了,但是由于finally 有return 语句,返回依然是finally 修改后i值。

2.3K51

令人头疼 Java 异常面试总结

没有通过 throws 抛出 try...catch 捕获,仍然可以编译通过,常见有 NullPointerException、ArrayIndexOutBoundException、ClassCastException...printStackTrace() 控制台中打印异常对象封装异常信息 try-catch-finallytry-with-resources try-catch-finally try :用于捕获异常...,后接零个多个 catch没有 catch 则必须加上 finallycatch:用于处理 try 捕获到异常; finally:无论是否捕获/处理异常,finally内容均会执行,就算...try catch 中有 return 语句,finally 中代码也将在方法返回之前执行; try-with-resources 当我们有必须要关闭资源时,建议优先使用 try-with-resources...final 用于修饰类、方法、变量,修饰类时表示类不能被继承;修饰方法时表示方法不能别重写,但是能够被重载;修饰变量时表示该变量是一个常量无法被重写赋值; finally 一般作用于 try...catch

58350

一个try-catch问出这么多花样

最后进入finally执行x=2; 此时虽然x已经被赋值为2了,但是由于刚才保护操作,执行真正return操作时,会将被保护临时存储变量入栈返回。...块包含return语句,则不会对try要返回值进行保护,而是直接跳到finally语句中执行,并最后finally语句中返回,返回值是finally改变之后值; finally 为什么一定会执行...原来是JVM为了保证所有异常路径和正常路径执行流程都要执行finally代码,所以trycatch后追加上了finally字节码指令,再加上它自己本身指令,正好三次。...请看 正常情况下,它是一定会被执行,但是至少存在以下三种情况,是一定不执行try语句没有被执行到就返回了,这样finally语句就不会执行,这也说明了finally语句被执行必要而非充分条件是...8: astore_1是指将抛出异常对象保存到局部变量1位置处 从字节码指令角度来讲,如果代码没有异常抛出,TCF执行时间可以忽略不计;如果代码执行过程中出现了上文中第6条,那么随着异常表遍历

39650

【Java基础】异常?NullPointException?世界上怎么会存在这种东西?

= var1; } finally { var1 = 1; } return var2; } 可以看到,int变量r因为byte范围内,所以int...变量r(var1)自动转化成了byte变量var1,然后新声明了一个变量byte var2,执行try语句return r时候,将r值赋给了变量var2(var2此时值为0),再执行finally...byte var9 = 2; return var9; } } 从编译结果看,先是try语句中进行1/0运算,然后finally语句中重新声明变量var9...内返回值且还会掩盖 trycatch异常,就像异常没有发生一样,也就是说finallyreturn会直接返回程序最终结果,而不会抛出异常。...这就说明,finally异常会覆盖trycatch抛出异常。

40050

(25) 异常 (下) 计算机程序思维逻辑

具体来说: 如果没有异常发生,try代码执行结束后执行。 如果有异常发生且被catch捕获,catch代码执行结束后执行 如果有异常发生但没被捕获,则在异常被抛给上层之前执行。...try/catch/finally语法catch不是必需,也就是可以只有try/finally,表示不捕获异常,异常自动向上传递,但finally代码异常发生后也执行。...} } 这个函数返回值是0,而不是2,实际执行过程是,执行到tryreturn ret;语句前,会先将返回值ret保存在一个临时变量,然后才执行finally语句,最后try再返回那个临时变量...如果在finally也有return语句呢?trycatchreturn会丢失,实际会返回finally返回值。...主要用于父类方法声明,父类方法内可能没有抛出,但子类重写方法后可能就抛出了,子类不能抛出父类方法没有声明checked exception,所以就将所有可能抛出异常都写到父类上了。

66460

看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了

为什么我们明明改了 person id 和 name ,编译器却没有报错呢?...with...resources,Java 引入了 try-with-resources 声明,将 try-catch-finally 简化为 try-catch,这其实是一种语法糖,并不是多了一种语法...效率:这个主要是针对 Java 早期版本来说 Java 早期实现,如果将方法声明为 final ,就是同意编译器将对此方法调用改为内嵌调用,但是却没有带来显著性能优化。...将类内部成员变量(包括实例变量和类变量声明为 private final ,不要提供可以修改成员变量方法,也就是 setter 方法。...调用 System.exit 方法 调用 Runtime.getRuntime().halt(exitStatus) 方法 JVM 宕机(搞笑脸) 如果 JVM try catch达到了无限循环

30530

Java 基础常见知识点&面试题总结(下),2022 最新版!

try块 :用于捕获异常。其后可接零个多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。 *catch块 :用于处理 try 捕获到异常。...finally 块 :无论是否捕获处理异常,finally 块里语句都会被执行。当在 try catch遇到 return 语句时,finally 语句块将在方法返回之前被执行。...语句中,任何 catch finally声明资源关闭后运行 《Effective Java》明确指出: 面对必须要关闭资源,我们总是应该优先使用 try-with-resources...通过使用分号分隔,可以try-with-resources块声明多个资源。...类实例化时才能真正传递类型参数,由于静态方法加载先于类实例化,也就是说类泛型还没有传递真正类型参数,静态方法加载就已经完成了,所以静态泛型方法是没有办法使用类上声明泛型

44540

java面试题 --- 基础

没有就先往常量池放一份再拿来用; 用加号拼接字符串,如果是两个常量拼接,编译期就直接拼接好,然后放到常量池中,如果有变量拼接,那就会调用 StringBuilder append 方法堆中生成新对象...抛出(Throw)、捕获(try catch)、声明(Throws)。 20. 你知道 finally 吗?...finally,配合 try catch 使用,try 写要捕获异常代码, catch 写捕获到异常后操作,finally 写一定要执行代码,比如关闭资源、释放连接等。...程序发生异常之前 try 代码块正常执行完之前,调用了 System.exist(),finally 中代码不会执行; 程序所在线程死亡,finally 代码不会执行。 22.... try catch 调用了 return,finally 还会执行吗? 会,且 return 之前执行。

28320

译文《最常见10种Java异常问题》

非检查型异常(Unchecked) 2、异常管理最佳实践箴言 3、为什么try代码块声明变量不能在catch或者finally中被引用?...异常管理最佳实践箴言 如果可以正确处理异常,则应将其捕获并处理,否则应将其抛出。 ? 为什么try代码块声明变量不能在catch或者finally中被引用?...看下面这段代码,try代码块声明 String s 就不能在catch中被引用, 这段代码在编译期是通不过。...; } 原因是你不知道try代码块哪个位置会引发异常, 很有可能在声明对象之前就引发了异常。...我们可以同一个catch子句中捕获多个异常吗? 答案是当然可以,不过如果在同一个catch子句中捕获这些异常都直接间接继承自同一父类,那么就只能在catch子句中捕获父类了。

63530

招银网络二面:Exception 和 Error 有什么区别?

try块 :用于捕获异常。其后可接零个多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。 catch块 :用于处理 try 捕获到异常。...finally 块 :无论是否捕获处理异常,finally 块里语句都会被执行。当在 try catch遇到 return 语句时,finally 语句块将在方法返回之前被执行。...这是因为 try 语句中 return 返回值会先被暂存在一个本地变量,当执行到 finally 语句中 return 之后,这个本地变量值就变为了 finally 语句中 return 返回值...语句中,任何 catch finally声明资源关闭后运行 《Effective Java》明确指出: 面对必须要关闭资源,我们总是应该优先使用 try-with-resources...通过使用分号分隔,可以try-with-resources块声明多个资源。

49110

深入理解 Java 异常

当程序可能出现这类异常时,倘若既没有通过 throws 声明抛出它,也没有try catch 语句捕获它,程序还是会编译通过。...IllegalStateException - 非法不适当时间调用方法时产生信号。换句话说,即 Java 环境 Java 应用程序没有处于请求操作所要求适当状态下。...finally 常用于这样场景:由于finally 语句块总是会被执行,所以那些 try 代码块打开,并且必须回收物理资源(如数据库连接、网络连接和文件),一般会放在finally 语句块释放资源...trycatchfinally 三个代码块局部变量不可共享使用。 catch 块尝试捕获异常时,是按照 catch声明顺序从上往下寻找,一旦匹配,就不会再向下执行。...异常注意事项 6.1. finally 覆盖异常 Java 异常处理 finally return 会覆盖 catch 代码块 return 语句和 throw 语句,所以 Java 不建议

77930

Java 进阶之异常处理

深入剖析 try-catch-finally 部分会以字节码角度分析为什么 finally 语句一定会执行。第三和第四部分理解起来可能会有些难度,不感兴趣小伙伴可直接跳过。..., YyyException { ...... } 要在程序中使用 methodD 方法,比如在 methodC 方法,你可以这样做: 将 methodD 方法调用包装在 try-catch try-catch-finally......... } 假设调用 methodD 方法 methodC 不希望处理异常(通过 try-catch),它可以方法签名声明这些异常,如下所示: public void methodC(...如果 catch 块捕获了该异常类该异常超类,则将执行该 catch语句。然后,catch 块之后执行 finally语句。...该程序将在 try-catch-finally 之后继续进入下一个语句,除非它被过早终止。 如果没有任何 catch 块匹配,则异常将沿调用堆栈传递。

66950

Java基础10:全面解读Java异常

方法要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。 这样异常一般是由程序运行环境导致。...}finally { System.out.println("我所在catch没有执行,我也不会执行"); } } } //方法声明抛出异常必须由调用方法处理或者继续往上抛...trycatchfinally,throws仅仅是将函数可能出现异常向调用者声明,而自己则不具体处理。...2、同一trycatchfinally ,如果try抛出异常,且有匹配catch块,则先执行catch块,再执行finally块。...3、同一trycatchfinallytry发生异常,且匹配catch处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者寻找合适catch

47420
领券