大数据之路week04--day06(I/O流阶段一 之异常)
从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房屋就算盖起来,风一吹就倒。
好了,废话不多说,进入正题:在学习I/O流之前,我们先掌握什么是异常和File
1、先看看异常的分类:
图1 异常的分类
从上图我们不难看出来,异常主要分为三大类:Error Exception RuntimeException
有朋友就要问了,上来就给我搞这些什么异常,还分类,不好理解啊!!别急,我来白话文说说:
什么是异常?
就是程序出现了不正常的情况。
还不清楚?继续举例:
比如说,今天天气很好,我要去市中心逛街,骑着自行车,去购物。但是呢?我遇到了一些问题:
问题1:去的路上我发生了车祸,我去不了了,这属于严重的问题。
问题2:我推着自行车,发现气儿没了,把气充起来,这属于出发前就应该检查的问题。
问题3:我骑着自行车在路上骑着,路两边是小石子路,但是我就是往上面骑车,结果我爆胎了,这属于运行时候出现的问题
相对应着:
程序的异常:Throwable
严重问题:Error 我们不处理,这种问题一般都是很严重的问题,比如说内存溢出
异常:Exception
又分为:
编译时期的异常:不是RuntimeException的异常,必须进行处理的,因为你不进行处理,编译就不会通过。
运行时期的异常:RuntimeException 这种问题我们也不处理,因为是程序员自身的问题,而且这个问题的出现肯定是我们的代码不够严谨,必须要进行修正代码的。
说了那么多,应该对什么是异常有了大概的了解了吧,接下来看操作!!嘿嘿
2、如果程序出现了问题,我们没有做任何处理,最终JVM(Java虚拟机)会做出默认的处理(把异常的名称,原因以及出现的问题位置等信息输出在控制台,同时会结束程序)如下代码:
package com.wyh.IO流day1; /** * 创建时间:2019年11月28日 下午8:53:26 * 项目名称:practise09_IO流(2) * @author WYH * @version 1.0 * @since JDK 1.8.0 * 文件名称:ExceptionDemo1.java * 类说明:
* try{
*
* }catch(){
*
* }finally{
*
* }
*/ public class ExceptionDemo1 {
public static void main(String[] args) {
int i = 10;
int j = 0;
// try {
System.out.println(i/j);
// } catch (Exception e) {
// System.out.println("除数不能为0");
// }
//
System.out.println("over"); } }
如何处理异常:
注意:
1、try里面的代码越少越好,因为Java虚拟机开辟的内存资源就会越少
2、一旦try里面出了问题,就会在这里把问题抛出去,然后和catch里面的问题进行匹配。
3、一旦有匹配的,就执行catch里面的处理。然后结束了try...catch...继续执行后面的语句
JDK7出现了一个新的异常处理方案:
代码展示:
package com.wyh.IO流day1; /** * 创建时间:2019年11月28日 下午8:53:26 * 项目名称:practise09_IO流(2) * @author WYH * @version 1.0 * @since JDK 1.8.0 * 文件名称:ExceptionDemo1.java * 类说明:
* JDK7版本新出现的异常处理方式
* try{
* ...
* }catch(异常类名1 | 异常类名2 | 异常类名3.. 异常名){
* ....
* }
*
*/ public class ExceptionDemo2 {
public static void main(String[] args) {
int i = 10;
int j = 0;
int[] arr =new int[3];
try {
System.out.println(i/j);
System.out.println(arr[3]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("出现异常");
} System.out.println("over"); } }
3、接下来学习一些Throwable中的方法:
getMessage() 获取异常信息,返回字符串
toString() 获取异常类名和异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
printStackTrace() 通常用该方法将异常内容保存在日志文件中,以便查阅。
package com.wyh.IO流day1; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /** * 创建时间:2019年11月28日 下午8:53:26 * 项目名称:practise09_IO流(2) * @author WYH * @version 1.0 * @since JDK 1.8.0 * 文件名称:ExceptionDemo1.java * 类说明:
* try{
*
* }catch(){
*
* }
* 的三种方法
*
*/ public class ExceptionDemo4 {
public static void main(String[] args) { //编译时异常
String s = "2019-11-28";
SimpleDateFormat ds = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
try {
Date d = ds.parse(s);
System.out.println(d);
} catch (ParseException e) {
// e.printStackTrace();
// System.out.println("解析日期出现了错误"); //方法一:getMessage()
// System.out.println(e.getMessage());//Unparseable date: "2019-11-28" //方法二:toString()
// System.out.println(e.toString());//java.text.ParseException: Unparseable date: "2019-11-28" //方法三:e.printStackTrace() 而我们经常使用的是这个
/*java.text.ParseException: Unparseable date: "2019-11-28"
at java.text.DateFormat.parse(DateFormat.java:366)
at com.wyh.IO流day1.ExceptionDemo4.main(ExceptionDemo4.java:39)*/
e.printStackTrace(); }
} }
小结:
4、throw
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
举例:
package com.wyh.IO流day1; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
*
* 创建时间:2019年11月28日 下午8:53:26
*
* 项目名称:practise09_IO流(2)
*
* @author WYH
*
* @version 1.0
*
* @since JDK 1.8.0
*
* 文件名称:ExceptionDemo1.java
*
* 类说明: throw
*
*/ public class ExceptionDemo6 {
public static void main(String[] args) {
System.out.println("我热爱大数据"); //在main方法里尽量不使用抛出,因为如果出错就无法走下去。
try {
method1();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {//为了保证程序正常进行运行
method2();//运行时期的异常调用时不做处理,如果出错依旧停止程序
} catch (Exception e) {
e.printStackTrace();
} System.out.println("所以我现在是大牛"); } //运行时期的异常在方法调用的时候可以不去处理
private static void method2() throws ArithmeticException{
int i = 10;
int j = 0;
System.out.println(i/j); } //编译时期的异常方法我们必须进行处理,抛出
private static void method1() throws ParseException {
// 编译时异常
String s = "2019-11-28";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date d = sdf.parse(s);
System.out.println(d); }
}
下面有一道这样的面试题:
(怎么找异常??跟进鼠标看方法是继承了什么异常类,看父类)
5、finally:被finally控制的语句一定会执行
package com.wyh.IO流day1; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
*
* 创建时间:2019年11月28日 下午8:53:26
*
* 项目名称:practise09_IO流(2)
*
* @author WYH
*
* @version 1.0
*
* @since JDK 1.8.0
*
* 文件名称:ExceptionDemo1.java
*
* 类说明: finally
* 注意:如果程序在执行到finally之前退出了,就不会执行
*
*/ public class ExceptionDemo7 {
public static void main(String[] args) {
String s = "2019-11-29";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); Date d = null; try {
sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
System.exit(0);
}finally{
System.out.println("这条语句时可以被执行的");
} System.out.println(d); }
}
那么就有这样的面试题:
6、自定义异常:
(1)自定义类并继承Exception父类:
package com.wyh.自定义异常; /** * 创建时间:2019年11月29日 下午8:42:32 * 项目名称:practise09_IO流(2) * @author WYH * @version 1.0 * @since JDK 1.8.0 * 文件名称:MyException.java * 类说明:
* 两种方式实现自定义异常(这里使用继承Exception) */ public class MyException extends Exception{
//无参构造
public MyException(){ } //有参构造,传递消息
public MyException(String s){
super(s);
}
}
(2)自定义另一个类,写方法,方法中抛出我们刚刚自定义的类:
package com.wyh.自定义异常; /** * 创建时间:2019年11月29日 下午8:55:18 * 项目名称:practise09_IO流(2) * @author WYH * @version 1.0 * @since JDK 1.8.0 * 文件名称:MyTeacher.java * 类说明:
* 定义新类,定义新的方法,使用自定义的异常 */ public class MyTeacher { public void check(int i) throws MyException{
if(i>100 || i<0){
throw new MyException("分数必须在0到100之间");
}else{
System.out.println("分数合理");
}
} }
(3)测试类:
package com.wyh.自定义异常; import java.util.Scanner; /**
*
* 创建时间:2019年11月29日 下午8:58:32
*
* 项目名称:practise09_IO流(2)
*
* @author WYH
*
* @version 1.0
*
* @since JDK 1.8.0
*
* 文件名称:ExceptionDemo.java
*
* 类说明: 测试我们的自定义异常
*/ public class ExceptionDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MyTeacher t = new MyTeacher();
while (true) {
System.out.println("请输入你的分数:");
int i = sc.nextInt();
if (i == 886) {
break;
} else {
try {
t.check(i);
} catch (MyException e) {
e.printStackTrace();
break;
} } }
} }
7、异常使用的注意事项:
下一节 介绍File
大数据之路week04--day06(I/O流阶段一 之异常)的更多相关文章
- 大数据之路week05--day01(I/O流阶段一 之File)
众所周知,我们电脑中有许许多多的文件夹和文件,文件的形式也有许多不同的格式,文件夹中也可以新建文件夹的存在,也就是多层的一步一步的嵌套. 我们想要实现I/O操作,就必须知道硬盘上文件的表现形式. 而J ...
- C#码农的大数据之路 - 使用C#编写MR作业
系列目录 写在前面 从Hadoop出现至今,大数据几乎就是Java平台专属一般.虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势. ...
- 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作
一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...
- 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例
一.引言 基于Hive+Hadoop模式构建数据仓库,是大数据时代的一个不错的选择,本文以郑商所每日交易行情数据为案例,探讨数据Hive数据导入的操作实例. 二.源数据-每日行情数据 三.建表脚本 C ...
- 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM
引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...
- 胖子哥的大数据之路(7)- 传统企业切入核心or外围
一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...
- 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍
引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文: The NoSQL Ecosystem 目录 The NoSQL Eco ...
- 胖子哥的大数据之路(四)- VisualHBase功能需求框架
一.引言 大数据在结构化数据存储方面的应用需求越来越明确,但是大数据环境下辅助开发工具的不完善,给数据库管理人员和开发人员带来的不变难以言表,基于此创建了开源项目VisualHBase,同时创建了Vi ...
- 大数据之路week01--自学之集合_1(Collection)
经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...
随机推荐
- Lamda
- Stream入门及Stream在JVM中的线程表现
继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. 小实验引入: 这 ...
- Netty自定义数据包协议
粘包和分包出现的原因是:没有一个稳定数据结构 解决办法: 分割符 长度 + 数据 * <pre> * 数据包格式 * +——----——+——-----——+——----——+——---- ...
- LIUNX随堂学习-2 用户和组,增、删、改、查
1.less的使用 less /etc/group #查看组的信息 less /etc/gshadow #查看组密码 例如:less /tmp/aa ...
- HTML 前端
昨日内容回顾 HTML文档结构 标签要封闭,全封闭,自封闭 html文件不识别多个空格或者换行,都识别成一个空格 注释: <!-- 注释 --> head标签 网页源信息,配置信息 tit ...
- JDBC(Java项目使用Oracle数据库)
Java项目中使用Oracle数据库(Eclipse) 前言 这学期选了Oracle数据库这门课,于是自己下载了Oracle11gR2版本的数据库.在这之前我一直用的是MySQL.虽然两者教程差不多, ...
- Python之系统编程笔记
概念 命令行工具. Shell 脚本. 系统管理 系统模块 sys 提供一组功能映射Python运行时的操作系统 os 提供跨平台可移植的操作系统编程接口 os.path 提供文件及目 ...
- 十三、GPIO子系统
由于之后的触摸屏驱动分析中使用到了GPIO子系统和i2c子系统,因此在分析触摸屏驱动之前我准备把这两个子系统进行简单分析. 之前我们使用GPIO引脚的方式并不是推荐的方式,当我们更改某一bit时,很有 ...
- SQLSERVER中计算某个字段中用分隔符分割的字符的个数
比如字段sid中用'|'分割的一些字符 a|b|c|d,需要通过sql查询出字符的个数是4. 可以使用如下脚本: SELECT LEN(sid)-LEN(REPLACE(sid,'|',''))+ ...
- php底层变量存储
变量存储 php的变量使用一个结构体 zval来保存的,在Zend/zend.h中我们可以看到zval的定义 struct _zval_struct { /* Variable information ...