哪个更适合finally块:
finally {
try {
con.close();
stat.close();
} catch (SQLException sqlee) {
sqlee.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
要么:
finally {
try {
if (con != null) {
con.close();
}
if (stat != null) {
stat.close();
}
} catch (SQLException sqlee) {
sqlee.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在帮助同事在他们的代码中调试一些奇怪的行为.以下示例说明了这一点:
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
Run Code Online (Sandbox Code Playgroud)
这个样本有什么回报?
你认为因为finally块,它返回"def",但事实上,它返回"abc"?我已经逐步完成了代码并确认了finally块实际上已被调用.
真正的答案是你不应该首先编写这样的代码,但我仍然对这种行为感到困惑.
编辑:根据一些答案澄清流程.
当您单步执行代码时,finally将在返回之前执行.
另一个面试问题是期待一个真/假答案,我不太确定.
我的一位同事null在最后的块中提到了参考.我认为这是胡说八道.
public Something getSomething() {
JDBCConnection jdbc=null;
try {
jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL);
...
}
finally {
JDBCManager.free(jdbc);
jdbc=null; // <-- Useful or not?
}
}
Run Code Online (Sandbox Code Playgroud)
你怎么看呢?
我知道这也是在其他主题上讨论过的,我所问的正是这个问题的标题.
是否有这样的情况,当try/finally终于不会执行?
try
//some error here
finally
//code that MUST be executed
end;
Run Code Online (Sandbox Code Playgroud)
我不是在讨论如何使用try..except/finally块,我只是想问这是否会发生.
LE:Application.Terminate /拔掉您的计算机是特殊情况.
据我了解,以下两个例子应该做同样的事情.为什么第一个被认为更好?
1:
try {
riskyMethod();
}
catch(Exception e) {
//handle exception
}
finally {
cleanUp();
}
Run Code Online (Sandbox Code Playgroud)
2:
try {
riskyMethod();
}
catch(Exception e) {
//handle exception
}
cleanUp();
Run Code Online (Sandbox Code Playgroud)
编辑:该示例是在Java中,但我想知道一般的块的概念,如在任何语言中使用
两个条件有什么区别?每次运行method1或method2时,都应该有一个运行所需的代码块.在我看来,2方法是相同的.
// example method1
void Method1(void)
{
try
{
// do something
}
catch (Exception ex)
{
// do something
}
finally
{
// do something whenever method1 runs
}
}
// example method2
void Method2(void)
{
try
{
// do something
}
catch (Exception ex)
{
// do something
}
// do something whenever method2 runs
}
Run Code Online (Sandbox Code Playgroud)
最后块对我来说似乎没必要.
在这一个我的头发上,我的双手.
我正在使用Apache PDFBox,因为我想在JAVA中逐行阅读pdf文件并稍后处理内容.但是我有以下问题..我在一个单独的java程序(在main方法中)使用了下面的代码,它在那里工作正常.但是,当我在我的tomcat服务器applet中使用它与石英调度程序一起出现问题时,我无法弄清楚原因.请记住,我将工作单独测试程序中的下面的行复制粘贴到我自己的大项目中,所以它是完全相同的代码.然而,在我更大的项目中,程序一直运行到String x1 = .. line,我放了一个断点.当我试图跨过它并没有'给出任何错误,控制台输出或任何东西,并跳过catch子句直接到最后.我在catch子句中加入了断点,它们没有被触发.
这是我的代码:
PDFTextStripper stripper;
PDDocument doc = null;
try{
doc = PDDocument.load("00026614_F_21Jan2013-18Feb2013.pdf");
stripper = new PDFTextStripper();
String x1= stripper.getText(doc); //SOMETHING GOES WRONG HERE
//break up the file content returned as a string into individual lines
List<String> ans= Arrays.asList(x1.split("\r\n"));//THIS IS NEVER REACHED
}
catch(Exception e){
e.printStackTrace(); //THIS IS NEVER REACHED EITHER
}
finally{
if(doc!=null) //IT GOES FROM STRING X1 STRAIGHT TO HERE.
doc.close();
}
Run Code Online (Sandbox Code Playgroud)
我得到的唯一输出来自LOG4J,它必须为程序的其他部分进行初始化,最后几行输出是
34212 [DefaultQuartzScheduler_Worker-1] DEBUG org.apache.pdfbox.util.PDFStreamEngine - processing substream token: PDFOperator{Tm}
34212 …Run Code Online (Sandbox Code Playgroud) 我有这个方法,我正在尝试使用Java SE 7的资源.
private void generateSecretWord(String filename){
try (FileReader files = new FileReader(filename)){
Scanner input = new Scanner(files);
String line = input.nextLine();
String[] words = line.split(",");
Collections.shuffle(Arrays.asList(words));
if (words[0].length()>1){
secretWord = words[0];
return;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally {
if (files!=null) files.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我在finally块中得到编译错误,files cannot be resolved to a variable
我在文件中引用了文件try with block.为什么我会收到此错误以及如何解决?
谢谢
关于RxJS do与finallyRxJS 之间的差异,我没有看到很好的文档.我的目标是仅在Observable返回数据时才采取行动,但看起来他们都会对失败采取行动.
do说" 为可观察序列中的每个元素调用一个动作,并在可观察序列的优雅或异常终止时调用一个动作. "observable可能返回多个元素?
finally说" 在源可观察序列正常或异常终止后调用指定的操作".我希望有人会解释是否重要,或者是否有更好的替代方法.
getData(choice): void {
this.dataService.getTableData(choice, 'mainCalls.php')
.do( () => this.defineWidth() )
.subscribe(tableData => this.tableData = tableData,
err => {
console.log(err);
}
);
}
ngOnInit() {
this.getData('getTableData');
}
Run Code Online (Sandbox Code Playgroud)
defineWidth是一个依赖于Observable返回的数据的函数.我愿意接受建议并阅读有关替代方法的材料,以实现我想要的目标.
finally ×10
java ×4
try-catch ×4
c# ×3
exception ×2
.net ×1
angular ×1
apache ×1
connection ×1
delphi ×1
delphi-2006 ×1
jdbc ×1
observable ×1
pdfbox ×1
rxjs ×1