代码改变世界

异常处理,动手动脑

2017-11-16 21:10  Robortxin  阅读(125)  评论(0编辑  收藏  举报

请阅读并运行AboutException.java示例

AboutException.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.阅读以下代码(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");

        }

    }

}

 

 

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

        }

    }

}

 

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语句块执行顺序始终保持被执行。

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

        

}

    

}

 

 

}

 

 

不会,因为有System.exit(0),而System.exit(0)可以终止程序。

6如何跟踪异常的传播路径?

当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。

可使用printStackTrace getMessage方法了解异常发生的情况:

printStackTrace:打印方法调用堆栈。

每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。

请通过 PrintExpressionStack.java示例掌握上述内容。

 

// Demonstrating the getMessage and printStackTrace

// methods inherited into all exception classes.

public class PrintExceptionStack {

   public static void main( String args[] )

   {

      try {

         method1();

      }

      catch ( Exception e ) {

         System.err.println( e.getMessage() + "\n" );

         e.printStackTrace();

      }

   }

 

   public static void method1() throws Exception

   {

      method2();

   }

 

   public static void method2() throws Exception

   {

      method3();

   }

 

   public static void method3() throws Exception

   {

      throw new Exception( "Exception thrown in method3" );

   }

}

 

 

 

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

public class TestThrows   {

public static void main(String[] args)     {

FileInputStream fis = new                       

                                                   FileInputStream("a.txt");

}

}

为什么?这是throws语句

throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。

当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。

 

 

 

 

 

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

要求程序必须具备足够的健壮性,不管用户输入什么样的内容,都不会崩溃

import java.util.Scanner;

 

 

public class Test {

public static void main(String[] args) {

        Scanner in=new Scanner(System.in);

 

 

     

        try {

           System.out.println("请输入你的成绩");

           int a=in.nextInt();

        

           

          if(0<=a&&a<60)

          {

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

          }

          else if(60<=a&&a<70)

          {

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

          }

          else if(70<=a&&a<80)

          {

           System.out.println("");

          }

          else if(80<=a&&a<90)

          {

           System.out.println("");

          }

          else if(90<=a&&a<100)

          {

           System.out.println("");

          }

          else 

          {

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

          }

          }

          catch(Exception e){

           System.out.println("输入错误");

           

           

          }

           

          }

 

 

          }

 运行结果: