异常处理

Posted Macsad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

1.           请阅读并运行AboutException.java示例

 import javax.swing.*;l

 

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异常处理机制:

Ø  把可能会发生错误的代码放进try语句块中。

Ø  当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。

               catch语句块中的代码用于处理错误。

Ø  当异常发生时,程序控制流程由try语句块跳转到catch语句块。

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

Ø  如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

 

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多层的异常捕获-2

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.

Ø  当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。

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

Ø  特别注意:

Ø  当有多层嵌套的finally时,异常在不同的层次抛出   ,在不同的位置抛出,可能会导致不同的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");

       

 

 

 

        }

   

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.辨析:finally语句块一定会执行吗?

 

 

package freeTest;

 

 

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

       

       }

   

    }

}

 

 

 

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

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

 

 

 

 

程序代码:

import java.util.*;

class MyException extends Exception

{

    MyException(String x)

    {

        super(x);

    }

}

public class ScoreRank {

    public static void main(String[] args) {

        Scanner scan=new Scanner(System.in);

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

        String score=scan.next();

        int flag=1;

        try 

        {

            if(score.length()>2)

            {

                if(!score.equals("100"))

                    flag=0;

            }

            if(score.charAt(0)==\'0\')

            {

                flag=0;

            }

            for(int i=1;i<score.length();i++)

            {

                if(score.charAt(i)>\'9\'||score.charAt(i)<\'0\')

                {

                    flag=0;

                }

            }

            if(flag==0)

            {

                MyException e=new MyException("非法输入");

                throw e;

            }

        

        }

        catch(MyException e)

        {

            System.out.println(e);

        }

        if(flag==1)

        {

            int s=Integer.parseInt(score);

            if(s<60)

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

            else 

            {

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

                if(s>60&&s<=70)

                    System.out.println("中");

                if(s>70&&s<=80)

                    System.out.println("良");

                if(s>80)

                    System.out.println("优");

            }

        }

    }

}

 

以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

java异常处理详解!!

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

异常处理,约束,MD5加密,日志处理

PHP异常处理

Java的异常处理语法