从这节开始,进入对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流阶段一 之异常)的更多相关文章

  1. 大数据之路week05--day01(I/O流阶段一 之File)

    众所周知,我们电脑中有许许多多的文件夹和文件,文件的形式也有许多不同的格式,文件夹中也可以新建文件夹的存在,也就是多层的一步一步的嵌套. 我们想要实现I/O操作,就必须知道硬盘上文件的表现形式. 而J ...

  2. C#码农的大数据之路 - 使用C#编写MR作业

    系列目录 写在前面 从Hadoop出现至今,大数据几乎就是Java平台专属一般.虽然Hadoop或Spark也提供了接口可以与其他语言一起使用,但作为基于JVM运行的框架,Java系语言有着天生优势. ...

  3. 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作

    一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...

  4. 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例

    一.引言 基于Hive+Hadoop模式构建数据仓库,是大数据时代的一个不错的选择,本文以郑商所每日交易行情数据为案例,探讨数据Hive数据导入的操作实例. 二.源数据-每日行情数据 三.建表脚本 C ...

  5. 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM

    引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...

  6. 胖子哥的大数据之路(7)- 传统企业切入核心or外围

    一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...

  7. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  8. 胖子哥的大数据之路(四)- VisualHBase功能需求框架

    一.引言 大数据在结构化数据存储方面的应用需求越来越明确,但是大数据环境下辅助开发工具的不完善,给数据库管理人员和开发人员带来的不变难以言表,基于此创建了开源项目VisualHBase,同时创建了Vi ...

  9. 大数据之路week01--自学之集合_1(Collection)

    经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...

随机推荐

  1. JS选中和取消选中checkbox

    document.getElementsByTagName("input")[0].checked = 0;//不选择 document.getElementsByTagName( ...

  2. 洛谷 题解 UVA10048 【噪音恐惧症 Audiophobia】

    [题意] 输入一个\(C\)个点\(S\)条边 \((C<=100)\) \((S<=1000)\)的无向带权图,边权表示该路径上的噪声值.当噪声太大时,耳膜可能会收到损伤,所以当你从某点 ...

  3. [转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点

    Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TC ...

  4. ABP中的本地化处理(上)

    今天这篇文章主要来总结一下ABP中的多语言是怎么实现的,在后面我们将结合ABP中的源码和相关的实例来一步步进行说明,在介绍这个之前我们先来看看ABP的官方文档,通过这个文档我们就知道怎样在我们的系统中 ...

  5. SQLServer 查询view中是否包含某个关键字

    在数据库view的创建中,会遇到一些跨数据库的view脚本,但是在将view更新到production的时候可能忘记更改database name,导致出现一些问题. 以下脚本可以检查出包含某个关键字 ...

  6. LaTeX 一些用法实例(并列图片、并列表格、算法代码示例、页眉太长、下划线,等)

    横向并列两个图片 \begin{figure} \begin{minipage}{0.49\linewidth} \centering \includegraphics[width=6.5cm]{Si ...

  7. Python习题006

    作业一:打印10*10  星星 ★☆ 要求一:普通打印★ l = 0 while l <10: h = 0 while h < 9: print("★", end=&q ...

  8. (转)从0移植uboot (四) _点亮调试LED

    这一节主要讨论1个问题:点灯.点灯是实际开发中,特别是裸板开发中常见的调试手段,相当于主机开发中漫天飞舞的printf/printk.为了追踪程序的现场执行情况,很多时候我们都使用点一个灯的方法来进行 ...

  9. jenkins 打安卓包 cpu使用过高处理操作

    登录两个控制台 打包开始后 在其中一台机器执行ps -ef |grep jenkins 找到执行打包的主进程复制pid 在另一个终端上执行 top -H -p pid 将最耗cpu的线程id转换为16 ...

  10. ant build打包

    使用ant build进行增量打包 <?xml version="1.0" encoding="gb2312"?> <project name ...