Java中的异常处理

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

1.代码:

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

     }

           

  }

}

   2.结果截图:

    

  

   3. 异常处理的基础知识:

Try{

          //可能发生运行错误的代码;

       }

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

          //用于处理异常的代码

       }

       finally{

          //用于“善后” 的代码

       }

    处理机制:把可能会发生错误的代码放进try语句块中。当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。catch语句块中的代码用于处理错误。当异常发生时,程序控制流程由try语句块跳转到catch语句块。不管是否有异常发生,finally语句块中的语句始终保证被执行。如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

 

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

  1.代码:

    

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

        }

    }

}

  2.结果截图:

    

  

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

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

     1.代码:

      

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

        }

    }

}

  2.结果截图:

  

  3.结果分析:当异常没有被处理时,无法捕获并处理新异常

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

    1.代码:

    

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

       

            }

   

     }

 

}

   

  2.结果截图:

  3.结果分析:一抛一接,抛之后必须有一接。当有多层嵌套的finally时,异常在不同的层次抛出,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

五. finally语句块一定会执行吗?请通过 SystemExitAndFinally.java示例程序回答上述问题

    1.代码:

  

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

       

            }

   

     }

 

 

}

   

   2.结果截图:

  3.改后代码:

  

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

       

            }

   

     }

 

 

}

  4.结果截图:

  5.结果分析:当try语句执行时,对应的finally语句会执行。当没有写入让系统执行退出的命令时,fanlly会执行。

六. 请看以下代码,它们完全符合Java语法规范,但事实是它们不能通过编译

   1.代码:

  

public class TestThrows   {

            public static void main(String[] args)     {

                   FileInputStreamfis=new      FileInputStream("a.txt");

                   }

     }     不能通过编译

  

  2.修正后的代码:

             public class TestThrows

{

     public static void main(String[] args)

                          throws FileNotFoundException

            {

                   FileInputStream fis = new   FileInputStream("a.txt");

            }

}

 

       修正之后通过编译

  3.原因:throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。

七.编写一个程序,此程序在运行时要求用户输入一个整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论

   1.代码:

  

import java.util.*;

class NumberError   extends Exception

{

     NumberError(String a)

     {

            super(a);

     }

}

class NumberBeyond extends Exception

{

     NumberBeyond(String b)

     {

            super(b);

     }

}

public class Level {

 

     /**

      * @param args

      */

     public static void Numbererror() throws     NumberError

     {

            throw new NumberError("");

     }

     public static void Numberbeyond()throws NumberBeyond

     {

            throw new NumberBeyond("");

     }

     public static void main(String[] args)  {

            // TODO Auto-generated method stub

            Scanner input=new Scanner(System.in);

            System.out.println("请输入分数");

 

    

                   String in=input.next();

                   int y=1;

                  

                   try

                   {

                  

                          for(int i=0;i<in.length();i++)

                          {

                                        if((in.charAt(i)>'9'||in.charAt(i)<0)&&in.charAt(i)!='.')

                                               {

                                                      Level.Numbererror();

                                               }

                          }

    

                         

                          try

                          {    

                                 double x=Double.parseDouble(in);

                                 if(x>100.0||x<0.0)

                                 {

                                        Level.Numberbeyond();

                                        y=0;

                                 }                  

                         

 

                          if(x>0.0&&x<60.0&&y==1)

                          {

                                 System.out.println("不及格");

                          }

                          if(x>=60.0&&x<70.0&&y==1)

                          {

                                 System.out.println("及格");

                          }

                          if(x>=70.0&&x<80.0&&y==1)

                          {

                                 System.out.println("中");

                          }

                          if(x>=80&&x<90&&y==1)

                          {

                                 System.out.println("良");

                          }

                          if(x>=90&&x<=100&&y==1)

                          {

                                 System.out.println("优");

                          }

                   }

                          catch(NumberBeyond e)

                          {

                                 System.out.println("输入超出范围"+e);

                          }

                  

            }

            catch (NumberError e)

            {

                   System.out.println("应该输入数字"+e);

           

            }

                  

     }

}

  2.结果截图:

posted @ 2016-11-25 13:40  IT瘦子  阅读(160)  评论(0编辑  收藏  举报