有三种情况需要考虑:
案例1:
public class Test {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
return;
System.out.println(3);
}
}
案例2:
public class Test {
public static void main(String[] args) {
try{
System.out.println(1);
return;
}finally{
System.out.println(2);
}
System.out.println(3);
}
}
案例3:
public class Test {
public static void main(String[] args) {
try{
System.out.println(1);
return;
}catch(Exception e){
System.out.println(2);
}
System.out.println(3);
}
}
据我所知,如果1语句System.out.println(3)
无法访问,那就是编译错误的原因,但为什么编译器在第3种情况下没有显示任何错误。
另请注意,在案例2中它甚至是编译器错误。
答案 0 :(得分:5)
案例3:
如果引发异常,则所有代码都可用,并打印1,2,3。这就是为什么你没有任何错误(无法访问的代码)的原因。
案例2:
在这种情况下,无论你不会到达System.out.println(3)
,因为你总是从main
方法返回。
答案 1 :(得分:3)
在案例2中,您有一个finally子句。它在try子句之后执行。所以执行顺序是:
和“System.out.println(3);”无法到达。
但是在案例3中你有一个cath子句。如果try子句中有Exeption,则执行它。 所以有可能的方法(有或没有错误的“System.out.println(1);”)
首先没有错误:
第二个错误:
PS:如果您在System.out.println(1)上有异常,则在案例2中;他会运行System.out.println(2);就在继续将异常抛到堆栈跟踪之前......
答案 2 :(得分:1)
在情况3中,如果println(1)抛出RuntimeException,则执行println(2),然后执行println(3)。因此,println(3)是可以访问的。
答案 3 :(得分:1)
在您的情况下1您有无法访问的代码,因为无论发生什么情况,您都将从该方法返回 但在案例3中,如果发生异常,您可以执行语句System.out.println(3)
案例3:
如果要在System.out.println(1)中获得异常,那么最终控制将转移到catch块并执行System.out.println(2)然后使用正常流程执行System.out .println(3)
现在是第二种情况:
如果你在try块中没有得到任何异常,它将执行System.out.println(1) 然后是System.out.println(3)
我认为不需要在try块内部返回,因为你必须在println(1)之后编写代码,这应该在println(1)中没有异常时执行
如此好的做法是编写代码如下
public class Test {
public static void main(String[] args) {
try{
System.out.println(1);
System.out.println(3);
}catch(Exception e){
System.out.println(2);
}
}
}
那么究竟是什么意思是依赖于System.out.println(1)的执行的语句也应该在System.out.println(1)之后的内部尝试和依赖于代码内部的语句尝试应该写在try-catch外面