zoukankan      html  css  js  c++  java
  • 异常处理

    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进行捕获,就终止程序。

     

  • 相关阅读:
    Java 包装类
    CTF 入门笔记
    Java 实践
    Java Object类
    Java 接口
    Java 抽象类
    Java 关键字final
    Java 多态性
    C#类,对象,类成员简介
    C#初始类和命名空间
  • 原文地址:https://www.cnblogs.com/zzh2019979439/p/7846765.html
Copyright © 2011-2022 走看看