动手动脑java异常处理

1>请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。

import javax.swing.*;

class AboutException {

   public static void main(String[] a)

   {

      float i=1, j=0, k;

      k=i/j;

      System.out.println(k);

    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中异常捕获语句

try{用于监控可能发生错误的语句}

catch(异常类型 异常对象引用)

{ 用于捕获并处理异常的代码 }

finally

{ //用于“善后” 的代码 }

不管是否有异常发生,finally语句块中的语句始终保证被执行。

2>阅读以下代码(CatchWho.java),写出程序运行结果:

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");

        }

    }

}

运行结果:

ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException

结果分析:当内层捕获异常并处理后,外层则不再捕获该异常。

3>写出CatchWho2.java程序运行的结果

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");

        }

    }

}

 

运行结果:

ArrayIndexOutOfBoundsException/外层try-catch

结果分析:当异常未被处理时无法接受新的异常。

4>请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。

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也不会执行,当有多层嵌套的finally语句时,异常在不同层次不同位置抛出时,也会导致不同的finally语句块执行顺序。

5>finally语句块一定会执行吗?

请通过 SystemExitAndFinally.java示例程序回答上述问题

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对应的try语句得到执行的情况下finally语句才会执行,但如果finally语句之前出现例如System.exit(0) 等使Java虚拟机停止运行的语句时finally语句也不会被执行。

备注:

  • 所有派生于Throwable类的异常类,基本都没有这些成员方法,也就是说所有的异常类都只是一个标记,记录发生了什么类型的异常(通过标记,编译期和JVM做不同的处理),所有实质性的行为Throwable都具备了。

  • 综上,在一个Throwable里面可以获取什么信息?

    • 获取堆栈跟踪信息(源代码中哪个类,哪个方法,第几行出现了问题……从当前代码到最底层的代码调用链都可以查出来)

    • 获取引发当前Throwable的Throwable。追踪获取底层的异常信息。

    • 获取被压抑了,没抛出来的其他Throwable。一次只能抛出一个异常,如果发生了多个异常,其他异常就不会被抛出,这时可以通过加入suppressed异常列表来解决(JDK7以后才有)。

    • 获取基本的详细描述信息

猜你喜欢

转载自www.cnblogs.com/1502762920-com/p/9943879.html