这些try-catch
块的使用与何时使用每个块有什么区别?
try {
doSomething1();
} catch(Exception e1){
exception_handle1();
}
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
try {
doSomething1();
doSomething2();
} catch(Exception e1) {
exception_handle1();
} catch(Exception e2) {
exception_handle2();
}
try {
doSomething1();
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
} catch(Exception e1){
exception_handle1();
}
答案 0 :(得分:3)
try {
doSomthing1()
catch(Exception e1){
exception_handle1()
}
try {
doSomthing2()
catch(Exception e2){
exception_handle2()
}
doSomthing1()
和doSomthing2()
是不相关的方法。其中任何一方的失败都是相互独立的。
try {
doSomthing1()
doSomthing2()
catch(Exception e1){
exception_handle1()
}catch(Exception e2){
exception_handle2()
}
如果doSomthing2()
失败,我们可以通过这种方式使用try-catch块来阻止doSomthing1()
方法执行。我们可以使用两个catch块单独处理每个异常。但是,需要注意的一点是,2nd catch block
是unreachable code
。通常,您应首先使用catch块来获取更具体的异常,然后是广义异常。现在,在你的情况下,第二个catch块应该处理的所有异常都将在第一个中处理。
try {
doSomthing1()
try {
doSomthing2()
catch(Exception e2){
exception_handle2()
}
}
catch(Exception e1){
exception_handle1()
}
我们有2个互相嵌入的try-catch块。即使在doSomthing2()
失败之后,程序仍将在try块内继续。
答案 1 :(得分:2)
嗯,第一个和另外两个之间的明显区别是,无论doSomthing2
是否引发异常,都会尝试doSomthing1
。在您引用的确切代码中,除了第三个示例中的第二个和第三个示例(除了语法错误)之外没有太大的区别,第二个try
的异常处理代码是 第一个的异常处理代码,因此如果它抛出,则会捕获throw。
您应该使用哪种方式完全取决于具体情况。有时,无论doSomthing2
是否抛出异常,运行doSomthing1
都是合适的。有时它不是。
答案 2 :(得分:2)
如果doSomThing1失败,则代码继续执行doSomthing2
在第二个示例中,如果doSomthing1失败,则doSomthing2不会执行
然而,第三个例子类似于第二个例子。
答案 3 :(得分:0)
创建条件语句时的概念相同,只是条件语句正在测试try catch测试错误的条件
答案 4 :(得分:0)
首先让asume,doSomething1()和exceltion_handle1(),不要调用System.exit(x)或其他东西。
1)所以第一段代码,将doSomething1(),无论doSomething1()是否会抛出任何异常,它将处理它(处理catch代码块)并前进到第二次尝试并以相同的方式运行它
try {
doSomething1();
} catch(Exception e1){
exception_handle1();
}
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
现在是早上,所以我希望我不会做出任何错误的决定。
2)这段代码将运行doSomething1()然后运行doSomething2(),无论哪一个都会失败(抛出异常),只会调用第一个catch子句,因为它会吸收所有子类和它自己,所以第二个catch赢了达不到(首先采取所有可能的例外)。 所以afaik,你应该得到一个错误(不应该编译)。这很聪明,并且会认识到,不会以任何方式达到第二次捕获。
正确的模式是:当我们走到谷底时,例外应该更广泛和更广泛(严格地说)。这是合乎逻辑的,因为捕捉条款的顺序下降,上限不应该是底部的父母,因为任何一个父母将采取该例外,并且底部的孩子将不会到达。
Example: (I recommend you to learn about Multicatch in java.)
catch (Specific2ChildOfSpecific1 e3)
...
catch (specific1ChildOfException e2)
...
catch (Exception e1)
try {
doSomething1();
doSomething2();
} catch(Exception e1) {
exception_handle1();
} catch(Exception e2) {
exception_handle2();
}
3)这一个:如果doSomething1()失败,将执行e1 catch子句,如果它将通过则全部,如果doSomething2()将运行,如果失败,则执行e2 catch子句。
注意@第二个例子,无论哪个doSomething都会失败,e1将被执行(不要忘记第二个无法访问时出现错误)。但我明白你想问的是什么。
try {
doSomething1();
try {
doSomething2();
} catch(Exception e2){
exception_handle2();
}
} catch(Exception e1){
exception_handle1();
}