异常处理

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Scanner;

 

class ATM{

    private String zhanghu;

    private String name;

    private String Date;

    private String mima;

    private double yuer;

   

    public String getMima(){

        return mima;

    }

    public void cunkuan(){

        System.out.println("请输入存款金额:");

        Scanner s=new Scanner(System.in);

        yuer+=s.nextDouble();

    }

    public void quluan(){

            String qu="";

            int quu=0;

            boolean f=true,q=true,h=true;

        while(q){

            Scanner ss=new Scanner(System.in);

            System.out.println("请选择:1、取款,2、返回,3、退卡。");

            int ch=ss.nextInt();

           switch(ch)

           {

           case 1:

            while(f){

               

                  System.out.println("请输入取款金额:");

                  Scanner s=new Scanner(System.in);

                qu=s.nextLine();

                int a=qu.length();

                for(int i=0;i<a;i++)

                {

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

                        {

                        h=false;

                        break;

                        }

                    else

                        h=true;

                }

                if(!h){

                try{

                    System.out.println("数字格式异常");

                    throw new myException();

                }

                catch(myException e){

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

                    f=true;

                   }

                }

              if(h){

               quu=Integer.parseInt(qu);

                if(quu%100!=0){

                    try{

                        System.out.println("数字录入错误,");

                        throw new myException();

                    }

                    catch(myException e){

                        System.out.println("请输入100的整数倍:");

                        f=true;

                    }

                }

                else

                    f=false;

              }

               

            }   

            yuer=yuer-quu;

            break;

           case 2:

               q=false;

               break;

           case 3:

               System.exit(0);

           }

        }

        }

    public void zhuanzhang(){

        boolean f=true;

        double zhuan=0;

        Scanner s=new Scanner(System.in);

        System.out.println("请输入转账账号");

        String zhang=s.nextLine();

        while(f){

        System.out.println("请输入转账金额:");

        zhuan=s.nextDouble();

   

        if(zhuan>yuer)     //转账超过余额。

            try{

            throw new myException();

            }

       

        catch(myException e){

                System.out.println("转账超出余额,请重新输入:");

            }

       

        else

            f=false;

        }

        yuer-=zhuan;  //当前余额

        System.out.println("转账成功!");

    }

    public void xiugai(){

        System.out.println("请输入当前密码:");

        Scanner s=new Scanner(System.in);

        String mi=s.nextLine();

        if(mi.equals(mima))

            {

              System.out.println("请输入要修改的密码:");

              mima=s.nextLine();

            

            }

        else

            System.out.println("密码错误,无法修改");

    }

    public void chaxun(){

        System.out.println("账户余额为:"+yuer);

    }

 

    public void set(String zhanghu,String name,String Date,String mina,double yuer){

        this.zhanghu=zhanghu;

        this.name=name;

        this.Date=Date;

        this.mima=mina;

        this.yuer=yuer;

    }

}

public class AtmException extends ATM {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        ATM a=new ATM();

        boolean f=false,q=true;

        int i=0;

        a.set("111111111111", "nasdf", "199508030048", "123456", 20000);

        while(q){

         System.out.println("请输入密码:");

         Scanner aa=new Scanner(System.in);

         String ba=aa.nextLine();

         i++;

         if(!ba.equals(a.getMima()))

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

             else

             {

                 q=false;

                 f=true;

             }

         if(q){

        

             if(i>=3)

             try{

                 throw new myException();

             }

         catch(myException e){

             System.out.println("密码输入超过三次,该卡被锁定");

             System.exit(0);

         }

         }

        }

        while(f){

          

            System.out.println("1、取款");

            System.out.println("2、存款");

            System.out.println("3、转账");

            System.out.println("4、查询");

            System.out.println("5、退出");

            System.out.println("请选择:");

            Scanner s=new Scanner(System.in);

            int b=s.nextInt();

            switch(b){

            case 1:

                a.quluan();

                a.chaxun();

                break;

            case 2:

                a.cunkuan();

                a.chaxun();

                break;

            case 3:

                a.zhuanzhang();

                a.chaxun();

                break;

            case 4:

                a.chaxun();

            case 5:

                System.exit(0);

                break;

               

            }

 

        }

 

    }

 

}

 

class myException extends Exception{

    public myException(){

       

    }

}

 

实验结果截图:

 

 

2、成绩输入异常处理

源代码:

 

import java.util.Scanner;

 

public class Exam {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        boolean f=true,h=true,q=true;

        int Sc=0;

      while(f){

        System.out.println("Please input a score:");

        Scanner s=new Scanner(System.in);

        String ss=s.nextLine();

      

        int a=ss.length();

        for(int i=0;i<a;i++){

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

                 break;

               

            else

                    {

                     q=false;

                     h=false;

                    }

        }

       

       

        if(q){

        try{

            throw new ScException();

        }

        catch(ScException e){

            System.out.println("格式错误");

          }

        }

       

       

       if(!h) //输入的是数字

       {

         Sc=Integer.parseInt(ss);

        if((Sc<0)||(Sc>100))

        {

            try{

                ScException x= new ScException();

                throw x;

            }

            catch(ScException x){

                System.out.println("输入异常,请输入整数");

           

               

            }

        }

        else

            f=false;

       }

      

      }

        if(Sc<60)

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

        else if(Sc<70)

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

        else if(Sc<80)

            System.out.println("中");

        else if(Sc<90)

            System.out.println("良");

        else if((Sc<100)||(Sc==100))

            System.out.println("优");

           

    }

 

}

class ScException extends Exception{

    public ScException(){

       

    }

}

 

实验结果截图:

 

 

二 动手动脑

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

     }

       

  }

}

 

 

核心代码1:

int i=1,j=0,k;

k=i/j;

 

代码执行时发生异常

核心代码2:

double i=1,j=0,k;

k=i/j;

 

 

 代码执行时不发生异常。

jvm在处理浮点数时,生成的是ddiv字节码指令,i/0,0转化为浮点数0.0,而0.0是double类型的,并不精确,所以不会抛出异常。

jvm在处理整数时,生成的是idiv字节码指令,整数除0就是除0,会抛出异常。

第一个程序没有执行finally?

 

finally 块必须与 try 或 try/catch 块配合使用。因为没有执行try,所以不会执行finally,异常是系统捕获的,try并没有抛出。

此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。

(无论从那点看,这个陈述都是正确的。有一种方法可以退出 try 块而不执行 finally 块。如果代码在 try 内部执行一条 System.exit(0); 语句,

则应用程序终止而不会执行 finally 执行。另一方面,如果您在 try 块执行期间拨掉电源,finally 也不会执行。)

 

 

2、多层的异常捕获

阅读以下代码,输出结果。

 

 

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

        }

    }

}

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

        }

    }

}

  

 

请看以下代码:

 

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

       

        }

   

    }

 

}

 

 

 

总结try catch finally

1)try抛出一个异常之后,程序会跳出try,不再执行try后边的语句,开始对catch进行匹配,处理异常;

2)try嵌套中,抛出的异常只有被处理才可以按顺序抛出下一个异常,如果不处理,程序就终止;

3)try抛出异常之后,就跳出了try语句,内层catch无法捕获就继续向外抛,所以外层也就有异常,外层语句不执行,第二个程序 throw  new ArithmeticExcepption没有执行。

4)第三个程序,try第一层第二层没有异常不用捕获,执行完之后到第三层,除0有异常,catch捕获,执行第三层的finally然后,顺序执行第二层,第一层的finally。

 

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

       

        }

   

    }

 

 

}

 

执行结果:

 

 

此程序中finally并未执行,原因是catch语句中的 System.exit(0);使得程序退出jvm了,所以finally也就不执行了。

4、总结try catch finally嵌套使用执行顺序。

1)try语句嵌套从外层到内层执行,在try语句中,哪一层出错,哪一层就抛出异常,后边的try语句就不再执行,如果该层存在catch就进行相应的捕获,有该层的finally也执行,除非finally遇到不执行的情况;

2)如果该层没有catch进行捕获,就向外抛出,去找catch,如果没有catch进行捕获,就终止程序。

 

原文地址:https://www.cnblogs.com/zzh2019979439/p/7846765.html