zoukankan      html  css  js  c++  java
  • 异常处理,动手动脑

    请阅读并运行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() + " " );

             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("输入错误");

               

               

              }

               

              }

              }

     运行结果:

     

     

  • 相关阅读:
    java集合框架小结(初级版)
    [leetcode]Decode Ways
    [leetcode]Distinct Subsequences
    [leetcode]Longest Valid Parentheses
    [leetcode]Edit distance
    python+selenium浏览器调用(chrome、ie、firefox)
    Python爬虫入门(6):Cookie的使用
    Python进行RSA安装加密
    解决cron无法运行报错:FAILED to authorize user with PAM (Module is unknown)
    使用eclipse开发Java web应用
  • 原文地址:https://www.cnblogs.com/maxin123/p/7846482.html
Copyright © 2011-2022 走看看