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

    学习要点

    • 使用try-catch-finally处理异常
    • 使用throw、throws抛出异常
    • 异常及其分类
    • log4j记录日志

      

    异常

    1  异常的定义

    异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。

    2  程序中的异常

    以下这段计算器代码是否存在问题?

    public class Calculator {
    
        public static void main(String[] args) {
    
            Scanner in = new Scanner(System.in);
    
            System.out.print("请输入被除数:");
    
            int num1 = in.nextInt();
    
            System.out.print("请输入除数:");
    
            int num2 = in.nextInt();
    
            System.out.println(String.format("%d / %d = %d", num1, num2, num1
    
                    / num2));
    
            System.out.println("感谢使用本程序!");
    
        }
    
    }
    

      

    使用已经学过的知识如何解决这个问题?

    public class Calculator {
    
        public static void main(String[] args) {
    
            Scanner in = new Scanner(System.in);
    
            System.out.print("请输入被除数:");
    
            int num1 = in.nextInt();
    
            System.out.print("请输入除数:");
    
            int num2 = 0;
    
            if (in.hasNextInt()) {
    
                num2 = in.nextInt();
    
                if (0 == num2) { // 如果输入的除数是0
    
                    System.err.println("输入的除数是0,程序退出。");
    
                    System.exit(1);
    
                }
    
            } else {// 输入的除数不是整数
    
                System.err.println("输入的除数不是整数,程序退出。");
    
                System.exit(1);
    
            }
    
            System.out.println(String.format("%d / %d = %d", num1, num2, num1
    
                    / num2));
    
            System.out.println("感谢使用本程序!");
    
        }
    
    }
    
     
    

      

    这样处理异常存在弊端:代码臃肿 、花费大量精力“堵漏洞”、很难堵住所有“漏洞”。如何解决这个问题?使用Java异常处理机制!

    异常处理

    1  Java异常处理机制

    Java编程语言使用异常处理机制为程序提供了错误处理的能力。

     

    Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws。

     

    2  try-catch

    语法结构

    try{
    
    //代码段1
    
    }catch(异常类型 ex){
    
         //对异常进行处理的代码段
    
    }
    
    //代码段2
    

     try-catch捕获异常的三种情况

    1. 代码段1没有捕获到异常,catch块中的代码不执行,执行代码段2
    2. 代码段1捕获到异常,产生异常对象,进行异常类型匹配,进入catch块中执行异常处理代码。处理完毕,继续执行代码段2。
    3. 代码段1捕获到异常,产生异常对象,异常对象不匹配,程序中断运行

    在catch块中处理信息

    1.自定义处理信息

    System.err.println("出现错误:被除数和除数必须是整数, 除数不能为零。");
    

    2.调用方法输出异常信息。异常对象常用的方法 

    方法名

    说    明

    void printStackTrace()

    输出异常的堆栈信息

    String getMessage()

    返回异常信息描述字符串,是printStackTrace()输出信息的一部分

    3.常见异常类型

       

    Exception

    异常层次结构的父类

    ArithmeticException

    算术错误情形,如以零作除数

    ArrayIndexOutOfBoundsException

    数组下标越界

    NullPointerException

    尝试访问 null 对象成员

    ClassNotFoundException

    不能加载所需的类

    IllegalArgumentException

    方法接收到非法参数

    ClassCastException

    对象强制类型转换出错

    NumberFormatException

    数字格式转换异常,如把"abc"转换成数字

     

     

     

     

     

     

     

     

     

     

     

     

     

    3  try-catch-finally

    语法说明

    • 是否发生异常都执行?
    • 不执行的唯一情况:System.exit(1)

     

     

     

    存在return的try-catch-finally

     

    4  多重catch

    try块中引发多种类型的异常

    • 排列catch 语句的顺序:先子类后父类
    • 发生异常时按顺序逐个匹配
    • 只执行第一个与异常类型匹配的catch语句

    执行流程示意图

     

    5  问题和上机练习

    问题1:try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序。

    问题2:try-catch- finally块中, finally块唯一不执行的情况是什么?

    上机练习

    需求描述:

    1. 按照控制台提示输入1~5之间任一个数字,程序将输出相应的电影片名。
    2. 根据键盘输入进行判断。如果输入正确,输出对应电影名称。如果输入错误,给出错误提示。
    3. 不管输入是否正确,均输出“欢迎光临FOX影院”语句。

    声明异常

    如果在一个方法体中抛出了异常,如何通知调用者?

     

    抛出异常

    除了系统自动抛出异常外,有些问题需要程序员自行抛出异常。

     

    Java异常分类

     

     

    提问和上机练习

    问题1:说出5个常见的运行时异常

    问题2:throw与throws的区别是什么?

    上机练习:使用throw抛出异常

    需求描述

    • 定义Person类
    • 在setAge(int age) 中对年龄进行判断,如果年龄介于1到100直接赋值,否则抛出异常。
    • 在测试类中创建对象并调用setAge(int age)方法,使用try-catch捕获并处理异常。

    log4j

    1  日志(log)

    • 主要用来记录系统运行中一些重要操作信息。
    • 便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因。

    2  日志分类

    • SQL日志、异常日志、业务日志等等。

    3  log4j

    Log4j是Apache的一个开源项目,是一个非常优秀的开源日志记录工具。

    • 控制日志的输出级别
    • 控制日志信息输送的目的地是控制台、文件等
    • 控制每一条日志的输出格式

    4  使用log4j的步骤

    第一步:项目创建lib目录,放入log4j的jar文件

    第二步:在src目录下创建log4j.properties文件

    第三步:配置日志信息

    ### 设置Logger输出级别和输出目的地 ###
    
    #日志记录器输出级别:fatal > error > warn > info >debug#
    
    log4j.rootLogger=debug, stdout,logfile
    
     
    
    ### 把日志信息输出到控制台 ###
    
    #日志信息输出到控制台#
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    
    #信息打印到System.err上 #
    
    log4j.appender.stdout.Target=System.err
    
    #指定日志布局类型#
    
    log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
    
     
    
    ### 把日志信息输出到文件:etc.log ###
    
    #日志信息写到文件中 #
    
    log4j.appender.logfile=org.apache.log4j.FileAppender
    
    #指定日志输出的文件名#
    
    log4j.appender.logfile.File=etc.log
    
    #指定转换模式#
    
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    
    #指定日志布局类型#
    
    log4j.appender.logfile.layout.ConversionPattern=
    
    %d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
    

      

    第四步:使用log4j记录日志文件

    public class Log4jDemo {
    
        // 创建Logger对象
    
        private static Logger logger = Logger.getLogger(Log4jDemo.class.getName());
    
        public static void main(String[] args) {
    
            try {
    
                Scanner in = new Scanner(System.in);
    
                System.out.print("请输入被除数:");
    
                int num1 = in.nextInt();
    
                System.out.print("请输入除数:");
    
                int num2 = in.nextInt();
    
                System.out.println(String.format("%d / %d = %d", num1, num2, num1
    
                        / num2));
    
            } catch (Exception e) {
    
                logger.error("出现异常", e);// 记录日志
    
            } finally {
    
                System.out.println("感谢使用本程序!");
    
            }
    
        }
    
    }
    

      

    5  上机练习

    需求描述:使用log4j输出日志到控制台和文件。

    • 按照控制台提示输入被除数和除数
    • 如果除数为0,在控制台输出日志信息,在文件中记录日志信息,包括完整的异常堆栈信息。


    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    利用线程池爬虫
    多任务协程怎么写
    利用协程多任务协程爬取前几页投诉网
    cookie的处理和代理池的建立
    bs4和xpath的用法
    怎么使用Ip代理词
    雪球网新闻标题的爬取
    爬虫学习的基础篇
    小说文本爬取
    24 张图彻底弄懂九大常见数据结构
  • 原文地址:https://www.cnblogs.com/rask/p/8253941.html
Copyright © 2011-2022 走看看