学习要点

  • 使用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,在控制台输出日志信息,在文件中记录日志信息,包括完整的异常堆栈信息。

JavaSE-14 异常处理的更多相关文章

  1. Java匹马行天下之JavaSE核心技术——异常处理

    Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...

  2. SpringBoot: 14.异常处理方式4(使用SimpleMappingExceptionResolver处理异常)(转)

    修改异常处理方法3中的全局异常处理Controller即可 package bjsxt.exception; import org.springframework.context.annotation ...

  3. 04 - JavaSE之异常处理

    异常的概念(运行期出现的错误) java 异常是 java 提供的用于处理程序中错误的一种机制. 所谓的错误是指在程序运行的过程中发生的一些异常事件.(如:除0溢出,数组下标越界,所要读取的文件不存在 ...

  4. java Vamei快速教程14 异常处理

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机 ...

  5. JAVASE(十三) 异常处理

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.异常体系结构 ​ 说明: |-----Throwable |-----Error :没针对性代码进行 ...

  6. javase(14)_java基础增强

    一.Eclipse的使用 1.在eclipse下Java程序的编写和run as,debug as,及java运行环境的配置. 2.快捷键的配置,常用快捷键: •内容提示:Alt + / •快速修复: ...

  7. 一文带你看遍 JDK9~14 的重要新特性!

    Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...

  8. Java基础10:全面解读Java异常

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. Python 目录整理

    基础部分: 1  常量  2 字符编码  字符编码补充 3 编码集 4 break与continue 5装饰器 6 迭代器 7生成器 8面向过程 9模块 10包 11 递归调用 12文件的用途 13类 ...

  10. java初学者必看的学习路线

    不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...

随机推荐

  1. I.MX6 Android can-utils 移植

    /******************************************************************* * I.MX6 Android can-utils 移植 * ...

  2. 并不对劲的p3676:小清新数据结构题

    题目大意 有一棵有\(n\)(\(n\leq 2*10^5\))个点的树,要进行\(q\)(\(q\leq 2*10^5\))次操作,每次操作是以下两种中的一种: 1.修改一个点的点权 2.指定一个点 ...

  3. 【转】Commonjs规范及Node模块实现

    前言: Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于javas ...

  4. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  5. IJ:IJ来了2-调试开发环境

    ylbtech-IJ:IJ来了2 1.返回顶部 1. 2. 3. 4. 2. 配置SVN返回顶部 1.SVN安装时,要选上command line client tools 2. 3.   4. 3. ...

  6. 机器学习经典算法笔记-Support Vector Machine SVM

    可供使用现成工具:Matlab SVM工具箱.LibSVM.SciKit Learn based on python 一 问题原型 解决模式识别领域中的数据分类问题,属于有监督学习算法的一种. 如图所 ...

  7. node+ws模块实现websocket

    先来吐槽一下,想要找点技术文章真tm不容易,全是jb复制粘贴,还冒充原创.搜索一个ws实现websocket全是一样的.一个字都没变,我能说什么.最后想到搜索ws模块githup居然前两页没有,也是那 ...

  8. idea简单使用

    注意 错误: 找不到或无法加载主类 main.scala03.WordCountDemo 上面解决方法:

  9. springboot(七) 配置嵌入式Servlet容器

    github代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...

  10. Phoenix数据覆盖的一种解决方案

    最近在做实时数仓,需要兼顾离线和实时两种查询方式,大致的方案是数据通过binlog抽取,经Phoenix插入,hive映射hbase表:Phoenix创建索引,实时查询Phoenix:离线查询hive ...