异常处理中的流程控制
Flow control in Exception Handling
我是 Java 的新手,无法理解 try-catch-finally 块中的控制流。每当在 catch 块中捕获到异常时,catch 块之后的代码也会被执行,无论我是否将其放在 finally 块中。那finally块有什么用呢?
class Excp
{
public static void main(String args[])
{
int a,b,c;
try
{
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e)
{
System.out.println("Divided by zero");
}
System.out.println("After exception is handled");
}
}
如果我将最后一个 print 语句放在 finally 块中,则没有区别。
如果 try/catch
块中发生另一个异常(未被您的代码处理),情况会有所不同。
如果没有finally
,最后一行将不会被执行。使用finally
,无论如何执行代码。
这对于执行垃圾收集器无法执行的清理任务特别有用:系统资源、数据库锁定、文件删除等...
如果 catch
块抛出异常,或者 try
块抛出不同的异常,finally
块也将执行。
示例:
try {
int a=5;
int b=0;
int c=a/b;
catch (NullPointerException e) {
// won't reach here
} finally {
// will reach here
}
您也可以完全省略 catch 块,但仍然保证会执行 finally 块:
try {
int a=5;
int b=0;
int c=a/b;
} finally {
// will reach here
}
考虑一下:
try {
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e){
throw new RuntimeException("Stuff went wrong", e);
}
System.out.println("This line will also not be executed");
finally 块中的代码 总是 执行,即使在 try
或 catch
中有一个 return
或一个未处理的例外。
here 对此进行了解释,这是通过非常简单的 google 搜索找到的。 请使用google.
finally 块可用于执行,即使在函数 returns 之后。
例如
public boolean doSmth() {
try {
return true;
}
finally {
return false;
}
}
会 return 错误;
我是 Java 的新手,无法理解 try-catch-finally 块中的控制流。每当在 catch 块中捕获到异常时,catch 块之后的代码也会被执行,无论我是否将其放在 finally 块中。那finally块有什么用呢?
class Excp
{
public static void main(String args[])
{
int a,b,c;
try
{
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e)
{
System.out.println("Divided by zero");
}
System.out.println("After exception is handled");
}
}
如果我将最后一个 print 语句放在 finally 块中,则没有区别。
如果 try/catch
块中发生另一个异常(未被您的代码处理),情况会有所不同。
如果没有finally
,最后一行将不会被执行。使用finally
,无论如何执行代码。
这对于执行垃圾收集器无法执行的清理任务特别有用:系统资源、数据库锁定、文件删除等...
如果 catch
块抛出异常,或者 try
块抛出不同的异常,finally
块也将执行。
示例:
try {
int a=5;
int b=0;
int c=a/b;
catch (NullPointerException e) {
// won't reach here
} finally {
// will reach here
}
您也可以完全省略 catch 块,但仍然保证会执行 finally 块:
try {
int a=5;
int b=0;
int c=a/b;
} finally {
// will reach here
}
考虑一下:
try {
a=0;
b=10;
c=b/a;
System.out.println("This line will not be executed");
}
catch(ArithmeticException e){
throw new RuntimeException("Stuff went wrong", e);
}
System.out.println("This line will also not be executed");
finally 块中的代码 总是 执行,即使在 try
或 catch
中有一个 return
或一个未处理的例外。
here 对此进行了解释,这是通过非常简单的 google 搜索找到的。 请使用google.
finally 块可用于执行,即使在函数 returns 之后。
例如
public boolean doSmth() {
try {
return true;
}
finally {
return false;
}
}
会 return 错误;