动手动脑:
多层的异常捕获-1:
ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException
多层的异常捕获-2:
ArrayIndexOutOfBoundsException/外层try-catch
当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。
请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
##特别注意:
当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。
在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。
package classJava;
import java.util.Scanner;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class AboutException {
public static void main(String[] a)
{
int i=100;
int j;
int k;
Scanner scan=new Scanner(System.in);
j=scan.nextByte();
k=i/j;
public static void main(String[] a)
{
int i=100;
int j;
int k;
Scanner scan=new Scanner(System.in);
j=scan.nextByte();
k=i/j;
try
{
k = i/j;
}
catch ( ArithmeticException e)
{
System.out.println("被0除. "+ e.getMessage());
}
catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("被0除");
else
{
System.out.println(e.getMessage());
}
}
finally
{
JOptionPane.showConfirmDialog(null,"OK");
}
System.out.println(k);
}
}
{
k = i/j;
}
catch ( ArithmeticException e)
{
System.out.println("被0除. "+ e.getMessage());
}
catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("被0除");
else
{
System.out.println(e.getMessage());
}
}
finally
{
JOptionPane.showConfirmDialog(null,"OK");
}
System.out.println(k);
}
}