异常处理动手动脑

时间:2021-10-04 04:02:36

一、.异常处理基础

测试代码一:

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("您输入的数据有误,请重新输入");
}
}
}
}

执行结果:

 异常处理动手动脑