一、.异常处理基础
测试代码一:
import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;
try
{
k = i/j; // Causes division-by-zero exception
//throw new Exception("Hello.Exception!");
}
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");
}
}
}
运行结果截图:
因执行 i/j 零作为除数而抛出异常
测试代码二(使用JAVA异常处理机制):
import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
//k=i/j;
try
{
k = i/j; // Causes division-by-zero exception
//throw new Exception("Hello.Exception!");
}
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");
}
}
}
执行结果:
JAVA异常处理:
1.捕获语句:
Try{
//可能发生运行错误的代码;
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后” 的代码
}
2.异常处理机制:
- 把可能会发生错误的代码放进try语句块中。
- 当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。
- catch语句块中的代码用于处理错误。
- 当异常发生时,程序控制流程由try语句块跳转到catch语句块。
- 不管是否有异常发生,finally语句块中的语句始终保证被执行。
- 如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
二、多层异常捕获:
测试代码一:
public class CatchWho {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}
}
执行结果:
测试代码二:
public class CatchWho2 {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArithmeticException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}
}
执行结果:
原因分析:
JAVA异常处理流程:
(1)如果程序中产生了异常,那么JVM根据异常的类型,实例化一个指定异常类的对象;
(2)如果这时程序中没有任何的异常处理操作,则这个异常类的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是进行异常信息的输出,而后中断程序执行;
(3)如果程序中存在了异常处理,则会由try语句捕获产生的异常类对象;
(4)与try之后的每一个catch进行匹配,如果匹配成功,则使用指定的catch进行处理,如果没有匹配成功,则向后面的catch继续匹配,如果没有任何的catch匹配成功,则这个时候将交给JVM执行默认处理;
(5)不管是否有异常都会执行finally程序,如果此时没有异常,执行完finally,则会继续执行程序之中的其他代码,如果此时有异常没有能够处理(没有一个catch可以满足),那么也会执行finally,但是执行完finally之后,将默认交给JVM进行异常的信息输出,并且程序中断。
三、finally执行时机:
测试代码:
public class EmbededFinally {
public static void main(String args[]) {
int result;
try {
System.out.println("in Level 1");
try {
System.out.println("in Level 2");
// result=100/0; //Level 2
try {
System.out.println("in Level 3");
result=100/0; //Level 3
}
catch (Exception e) {
System.out.println("Level 3:" + e.getClass().toString());
}
finally {
System.out.println("In Level 3 finally");
}
// result=100/0; //Level 2
}
catch (Exception e) {
System.out.println("Level 2:" + e.getClass().toString());
}
finally {
System.out.println("In Level 2 finally");
}
// result = 100 / 0; //level 1
}
catch (Exception e) {
System.out.println("Level 1:" + e.getClass().toString());
}
finally {
System.out.println("In Level 1 finally");
}
}
}
执行结果:
结论:
finally 代码块出现在 catch 代码块最后,用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
四、finally探讨:
测试代码:
public class SystemExitAndFinally {
public static void main(String[] args)
{
try{
System.out.println("in main");
throw new Exception("Exception is thrown in main");
//System.exit(0);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(0);
}
finally
{
System.out.println("in finally");
}
}
}
执行结果:
结论:
当程序在finally代码块之前结束时,因程序退出,finally内的语句将不再执行。
五、课程成绩:
程序代码:
import java.util.Scanner;
public class Grade {
public static void main(String[] args) {
double score = 0;
String G;
while(true) {
Scanner in = new Scanner(System.in);
try {
score = in.nextDouble();
int s = (int)score;
s = s / 10;
switch(s) {
case 10:
case 9:G = "优";break;
case 8:G = "良";break;
case 7:G = "中";break;
case 6:G = "及格";break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:G = "不及格";break;
default:throw new Exception();
}
System.out.println(G);
break;
}catch(Exception e) {
System.out.println("您输入的数据有误,请重新输入");
}
}
}
}
执行结果: