10.14上课问题的讨论与思考

异常处理
数据库内部的定义的数据类型与前台输入的数据类型不一致

一、课堂小测

王建明老师,一上课就让我们15分钟编写一个小程序,条件如下:
输入一个整数,程序输出不及格、及格、中、良、优的结论
源码如下:
import java.util.Scanner;
    public class wrong {
        public static void main(String []args) {
            Scanner sc = new Scanner(System.in);
            int p=1;
            while(p>0) {
                System.out.println("请输入一个整数:");
                int score = sc.nextInt();
                if (score < 60&&score>0) {
                    System.out.println("不合格");
                } else if (score >= 60&&score<70) {
                    System.out.println("合格");
                } else if (score >= 70&&score<80) {
                    System.out.println("中");
                } else if (score < 90&&score>=80) {
                    System.out.println("良");
                } else
                if(score<=100)
                {
                    System.out.println("优");
                }
                else{
                    System.out.println("你输入的整数有误");
                }
                System.out.println("是否继续输入(1/0)");
                p=sc.nextInt();
            }

        }
    }

我经过10多分钟写完程序之后,王建民老师又提出了让我们同桌互换电脑,想办法把对方的程序玩坏,结果我的程序被玩坏的运行结果如下:

 

通过运行可以看出,我用输入语句接受一个整数类型,程序可以完美运行,但当我输入一个字符类型时,程序开始报错。王建民老师指出这就是一个典型的异常,他今天要讲的如何进行异常处理。

二、JAVA异常处理基础

异常:发生于程序运行期间,表现出非法的运行状况。

异常处理的目的是根据实际情况提供不同错误应对的策略与手段,使程序运行更安全。

异常处理的主要用途就是精准提供错误信息。

三、动手动脑

运行以下代码:

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

运行结果如下:

在这个程序里面0被整除了,这显然是不符合逻辑的,因此报错了

四、Java中的异常捕获语句

           try{

                   //可能发生运行的错误;

             }

       catch (异常类型 异常对象引用){

                      //用于处理异常的代码

            }

         finally{

                   //用于“善后”的代码

            }

使用java异常处理机制

  • 把可能发生错误的代码放进try语句
  • catch语句块中的代码用于处理错误
  • 不管是否有异常发生,finally语句块中的语句始终保证被执行。

 五、java中的异常分类

Throwable类有两个直接子类:

Exception:出现的问题是可以被捕获的;

Error:系统错误,通常由JVM处理。

可捕获的异常又可以分为两类:

(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出

(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:

throw new ArithmeticException(…);

六、assert语句

assert语句又被称为断言,可以帮助我们在条件不满足程序运行的情况下直接返回错误, 而不必等待程序运行出现崩溃后再退出程序

在使用assert语句时,系统会先判断assert后面紧跟的语句是True还是False,如果是True,则继续往下执行语句,如果是False,则程序中断,调用默认的异常处理器,同时系统还会将assertFalse语句逗号后面的提示信息输出。

在默认情况下,assert功能是关闭的,可以在使用java启动jvm添加参数-ea打开它

七、Error——OOM Error

在Android应用中会经常出现OOM Error错误,这表示系统内存不足,这就涉及到了 catch OOM并手动释放内存

八、一个奇怪的现象

对于这种现象的产生,原因是浮点数规定除以0会出现Infinity,而整型没有此类型规定,所以jvm在执行两个代码时,会采取不同的处理策略,导致代码的运行结果不同

九、动手动脑

通过两个代码可以发现,先抛哪个,哪个就先执行

十 多个嵌套的try....catch...finallly

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代码块语句会一直执行

十一、finally一定会被执行吗?

 

 通过上面的运行可以看出,finally代码块里面的语句不一定输出,当try代码块里有了抛出语句,catch代码块和finally代码块里面的语句不会再输出

 

 

posted @ 2022-10-15 21:47  伽澄  阅读(24)  评论(0编辑  收藏  举报