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没有捕获到异常,catch块中的代码不执行,执行代码段2
- 代码段1捕获到异常,产生异常对象,进行异常类型匹配,进入catch块中执行异常处理代码。处理完毕,继续执行代码段2。
- 代码段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~5之间任一个数字,程序将输出相应的电影片名。
- 根据键盘输入进行判断。如果输入正确,输出对应电影名称。如果输入错误,给出错误提示。
- 不管输入是否正确,均输出“欢迎光临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 异常处理的更多相关文章
- Java匹马行天下之JavaSE核心技术——异常处理
Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...
- SpringBoot: 14.异常处理方式4(使用SimpleMappingExceptionResolver处理异常)(转)
修改异常处理方法3中的全局异常处理Controller即可 package bjsxt.exception; import org.springframework.context.annotation ...
- 04 - JavaSE之异常处理
异常的概念(运行期出现的错误) java 异常是 java 提供的用于处理程序中错误的一种机制. 所谓的错误是指在程序运行的过程中发生的一些异常事件.(如:除0溢出,数组下标越界,所要读取的文件不存在 ...
- java Vamei快速教程14 异常处理
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机 ...
- JAVASE(十三) 异常处理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.异常体系结构 说明: |-----Throwable |-----Error :没针对性代码进行 ...
- javase(14)_java基础增强
一.Eclipse的使用 1.在eclipse下Java程序的编写和run as,debug as,及java运行环境的配置. 2.快捷键的配置,常用快捷键: •内容提示:Alt + / •快速修复: ...
- 一文带你看遍 JDK9~14 的重要新特性!
Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...
- Java基础10:全面解读Java异常
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Python 目录整理
基础部分: 1 常量 2 字符编码 字符编码补充 3 编码集 4 break与continue 5装饰器 6 迭代器 7生成器 8面向过程 9模块 10包 11 递归调用 12文件的用途 13类 ...
- java初学者必看的学习路线
不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...
随机推荐
- bzoj4031
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 823 Solved: 407[Submit][Statu ...
- WebUploader上传大文件时,上传出错问题
上传普通文件没有问题,当文件达到一定大小的时候,上传错误,返回结果是404,我可以肯定的是路径是没有问题的.因为上传小文件等都是可以的. 然后使用webuploader的uploaderror监控错误 ...
- bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...
- bzoj 1858: [Scoi2010]序列操作【线段树】
合并中间那块的时候没取max--WAWAWA 在线段树上维护一堆东西,分别是len区间长度,sm区间内1的个数,ll0区间从左开始最长连续0,ml0区间中间最长连续0,rl0区间从右开始最长连续0,l ...
- unsign 字段相减出现负数解决方法
在项目中做数据统计的时候需要用到几个字段相减得到想要的值,但是因为字段都是无符号,相减出现mysql 错误 BINGINT UNSIGNED VALUE .. 在c语言中两个无符号相减值为负数,该值 ...
- JavaScript 入门案例
四. JavaScript 入门案例 在看本节之前,笔者建议您先看 JavaScript 基础篇 https://www.cnblogs.com/IT-LFP/p/10945884.html 1. ...
- TRACE Method 网站漏洞,你关闭了吗[转]
危险:该漏洞可能篡改网页HTML 源码 最近采用360 web scan 对服务器进行扫描.发现漏洞.TRACE Method Enabled 安全打分98分.前一阵有网页JS被人篡改,可能就是从这个 ...
- [GZOI2016] 亚索的量子实验【分块】
第二题 亚索的粒子实验 [问题描述] 亚索是一名伟大的科学家,他最近在做一个粒子的实验,粒子初始有一定的能量,实验过程中倘若第i个粒子被注入k能量,那该粒子就会增加k能量,同时由于辐射作用,第2i,3 ...
- 题解报告:hdu 2030 汉字统计
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2030 Problem Description 统计给定文本文件中汉字的个数. Input 输入文件首先 ...
- Hadoop集群搭建及MapReduce应用
一.Hadoop集群的搭建与配置 1.节点准备 集群规划: 主机名 IP 安装的软件 运行的进程 weekend 01 192.168.1.60 jdk.hadoop NameNode.DFSZKFa ...
