Java IO流—异常及捕获异常处理 try…catch…finally

目录
  • 一、Java IO流
    • 1、概念
    • 2、IO流的分类(按流向划分)
    • 3、IO流的分类(按操作单元划分)
    • 4、IO流的分类(流的角色划分)
  • 二、Java 异常
    • 1、概述
    • 2、常见的异常
    • 3、异常的分类
  • 三、异常处理方案
    • 1、try…catch…finally
  • 四、try…catch 处理方式
    • 1、一个异常的情况与多个异常的情况
  • 五、Throwable中的方法
    • 1、getMessage()
    • 2、toString()
    • 3、printStackTrace()
    • 4、printStackTrace(PrintStream s)
  • 六、throws
    • 1、概述
  • 七、throw
    • 1、概述
  • 八、throws和throw的区别
  • 九、try…catch…finally…
    • 1、格式
    • 2、注意
    • 3、代码
  • 十、final , finally 和 finalize的区别
  • 十一、异常注意事项

一、Java IO流

1、概念

在Java中,把不同的输入源 / 输出源(如:键盘、文件、网络链接等)抽象的表述为“”(stream)通过 ”流“ 的形式允许Java程序使用相同的方式访问不同的输入 / 输出源Java 把所有传统的”“放在了 java . io 包下

2、IO流的分类(按流向划分)

输入流:只能从中读取数据,不能写入输出流:只能写入数据,不能读取数据

3、IO流的分类(按操作单元划分)

字节流:操作单元是8位的字节,主要是 InputStream 和 OutputStream 作为基类字符流:操作单元是16位的字符,主要是 Reader 和 Writer 作为基类

4、IO流的分类(流的角色划分)

节点流:可以向一个特定的 IO 设备(如磁盘等)读 / 写数据的流,也称为:低级流处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能,也称为高级流

二、Java 异常

1、概述

Java在运行程序过程中出现的错误

2、常见的异常

  • 空指针异常类:NullPointerException
  • 类型强制转换异常:ClassCastException
  • 数组下标越界异常:ArrayIndexOutOfBoundsException
  • 算术异常类:ArithmeticExecption
  • 数组负下标异常:NegativeArrayException

3、异常的分类

三、异常处理方案

1、try…catch…finally

格式:

try {
	可能出现问题的代码;
}catch(异常名 变量) {
	针对问题的处理;
}finally {
	释放资源;
}

代码:

package yichang01;
public class ExceptionDemo {
    public static void main(String[] args){
        System.out.println("start");
        int[] arr = {1,2,3,4,5};
        try {
            System.out.println(arr[5]);
        }catch (Exception e){
            System.out.println("发生了异常:"+e.getMessage());
            e.printStackTrace();//打印异常的栈
        }finally {//有没有异常都会执行 finally 里的代码
            System.out.println("释放资源,必须执行的代码块");
        }
        //System.out.println(arr[5]);//数组下标越界
        System.out.println("end");
    }
}

变形格式:

try {
 	可能出现问题的代码;
}catch(异常名 变量) {
	针对问题的处理;
}
package yichang01;
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("start");
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

注意:

  • try 里面的代码越少越好
  • catch 里面必须有内容,哪怕给出一个简单的提示

四、try…catch 处理方式

1、一个异常的情况与多个异常的情况

package yichang01;
public class ExceptionDemo {
    public static void main(String[] args) {
        //method1();//一个异常的情况
        //method2();//两个异常、分别处理的情况
        //method3();//两个异常、一块处理的情况
        method4();
    }
    private static void method4() {
        int a = 10;
        int b = 0;
        int[] arr = {1, 2, 3};
        try {
            Object o = 123;
            String s = (String) o; //ClassCastException
            System.out.println(arr[3]); //IndexOutOfBoundException
            System.out.println(a / b); //ArithmeticException
            System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你访问了不该的访问的索引");
        } catch (Exception e) {
            System.out.println("出问题了");
        }
        System.out.println("over");
    }
    private static void method3() {
        int a = 10;
        int b = 0;
        int[] arr = {1, 2, 3, 4, 5};
        try {
            System.out.println(a / b);
            System.out.println(arr[5]);
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界");
        }
        System.out.println("end");
    }
    private static void method2() {
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("end1");
        int[] arr = {1, 2, 3, 4};
        try {
            System.out.println(arr[4]);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("end2");
    }
    private static void method1() {
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

五、Throwable中的方法

1、getMessage()

获取异常信息,返回字符串。

2、toString()

获取异常类名和异常信息,返回字符串。

3、printStackTrace()

获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

4、printStackTrace(PrintStream s)

通常用该方法将异常内容保存在日志文件中,以便查阅。

package yichang01;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
    public static void main(String[] args) {
        String s = "2019-06-17";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date d = sdf.parse(s);
            System.out.println(d);
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

六、throws

1、概述

定义功能方法时,需要把出现的问题暴露出来,让调用者去处理

package yichang02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
    public static void main(String[] args) throws ParseException {
        System.out.println("start");
        method1();
        System.out.println("end11");
        //method2();
        System.out.println("end22");
    }
    private static void method2() throws ArithmeticException {//运行期异常抛出
        int a = 10;
        int b = 0;
        System.out.println(a / b);
    }
    private static void method1() throws ParseException {//编译期异常抛出
        String s = "2014-11-20";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(s);
        System.out.println(d);
    }
}

七、throw

1、概述

在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,用 throw 把异常对象抛出

package yichang02;
public class ExceptionDemo {
    public static void main(String[] args) {
        Student s = new Student();
        s.setAge(-30);
    }
}
class Student {
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if (age > 1) {
            this.age = age;
        } else {
            try {
                throw new Exception("年龄不能小于1");//throw:方法内部,一般出现了逻辑错误,手动抛出的自定义异常
            } catch (Exception e) {
                e.printStackTrace();
            }
            this.age = 1;
        }
    }
}

八、throws和throw的区别

throws

  • 用在方法声明后,跟的是异常类名
  • 可以跟多个异常类名,用逗号隔开
  • 表示抛出异常,由该方法的调用者来处理
  • throws 表示出现异常的一种可能性,并不一定会发生这些异常

throw

  • 用在方法体内,跟的是异常对象名
  • 只能抛出一个异常对象名
  • 抛出异常,由方法体内的语句处理
  • throw 则是抛出了异常,执行 throw 则一定抛出了某种异常
package yichang02;
class ExceptionDemo {
    public static void main(String[] args) {
        //method1();
        try {
            method2();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
    private static void method2() throws Exception {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw new Exception();
        } else {
            System.out.println(a / b);
        }
    }
    private static void method1() {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw new ArithmeticException();
        } else {
            System.out.println(a / b);
        }
    }
}

九、try…catch…finally…

1、格式

 try...catch...finally
 try...catch
 try...catch...catch...
 try...catch...catch...finally
 try...finally

2、注意

被finally控制的语句体一定会执行

用于释放资源,在IO流操作和数据库操作中会见到

3、代码

package yichang02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
class ExceptionDemo {
    public static void main(String[] args) {
        String s = "2019-6-17 12:12:12";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = null;
        try {
            d = sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
            System.exit(0);
        } finally {
            System.out.println("这是必然执行的代码");
        }
        System.out.println(d);
    }
}
package yichang02;
class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println(getInt());
    }
    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
            return a;
        } catch (Exception e) {
            System.out.println("catch");
            a = 30;
            return a;
        } finally {//释放资源,会执行的代码
            System.out.println("finally");
            a = 40;
            return a;
        }
        // return a;
    }
}

十、final , finally 和 finalize的区别

1、final:最终的意思,可以修饰类,成员变量,成员方法

  • 修饰类,类不能被继承
  • 修饰变量,变量是常量
  • 修饰方法,方法不能被重写

2、finally:是异常处理的一部分,用于释放资源。

  • 一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了

3、finalize:是Object类的一个方法,用于垃圾回收

十一、异常注意事项

  • 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
  • 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
  • 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java异常:异常处理--try-catch结构详解

    目录 总结 从键盘接收两个整数,输出两数的商: package java_exception; import java.util.Scanner; public class TryDemoOne { public static void main(String[] args) { //定义两个整数,键盘输入两个整数,输出两数之商 Scanner input = new Scanner(System.in); System.out.println("=====运算开始====="); S

  • 简单谈谈java的异常处理(Try Catch Finally)

    异常的英文单词是exception,字面翻译就是"意外.例外"的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 一 前言 java异常处理大家都不陌生,总的来说有下面两点: 1.抛出异常:throw exception class SimpleException{ public void a() throws Exception{ throw new Exception(); }; } 2.捕获异常: public class MyExcepti

  • Java异常处理之try...catch...finally详解

    异常处理机制已经成为判断一门编程语言是否成熟的标准之一,其对代码的健壮性有很大影响.一直以来异常处理使用不是很得心应手,今天对异常进行了较为深入的学习,这篇主要是对try-catch-finally的一个总结. 一.java继承体系 Java语言为异常处理提供了丰富的异常类,这些类之间有严格的继承关系.如图: 从图中我们可以看出,所有的类都是继承于Throwable这个父类,java将所有的非正常情况分为两种:Error(错误)和Exception(异常),Error错误一般是于虚拟机相关的问题

  • Java IO流—异常及捕获异常处理 try…catch…finally

    目录 一.Java IO流 1.概念 2.IO流的分类(按流向划分) 3.IO流的分类(按操作单元划分) 4.IO流的分类(流的角色划分) 二.Java 异常 1.概述 2.常见的异常 3.异常的分类 三.异常处理方案 1.try-catch-finally 四.try-catch 处理方式 1.一个异常的情况与多个异常的情况 五.Throwable中的方法 1.getMessage() 2.toString() 3.printStackTrace() 4.printStackTrace(Pri

  • Java IO流对象的序列化和反序列化实例详解

    Java-IO流 对象的序列化和反序列化 序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中: 反序列化流(ObjectInputStream),readObject 方法用于从输入流中读取对象. 3.序列化接口(Serializeable) 对象必须实现序列化接口,才能进行序列化,否则会出现异常.这个接口没有任何方法,只是一个标准. packag

  • java IO流 之 输入流 InputString()的使用

    本文主要给大家介绍java的InputStream 流的使用. (1)FileInputstream: 子类,读取数据的通道 使用步骤: 1.获取目标文件:new File() 2.建立通道:new FileInputString() 3.读取数据:read() 4.释放资源:close() //一些默认要导入的包 import java.io.File; import java.io.FileInputStream; import java.io.IOException; public sta

  • Java IO流之节点流与字符流的相关知识总结

    一.File file是文件和目录路径名的抽象表示 1.1 File的用法 用法: File file = new File("路径名"); //如 File file = new File("L:\\FileTestDemo\\AAA\\aaa.txt"); 注意:在windows中,路径名不能使用单个的\,单个的\为转义字符,可以使用\\,//或/ 1.2 File的常用方法 1.boolean createNewFile() 当且仅当具有此名称的文件尚不存在时

  • Java IO流之字符流的使用详解

    目录 一.字符流的出现 二.字符输入流Reader 三.文件字符输入流 FileReader 四.字符输出流 Writer 五.文件字符输出流 FileWriter 六.close()和flush()的区别 七.换行和续写 八.使用try-catch-finally处理流异常 一.字符流的出现 中文在GBK中占有两个字节,在utf-8中占有三个字节(即需要三个字节才能组成一个中文字),字节流读取中文时由于编码集的不同,字节流读取中文也比较麻烦,从而出现了字符流 字符流也在java.io包下 二.

  • java IO流文件的读写具体实例

    引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

  • Java IO流 文件的编码实例代码

    •文件的编码 package cn.test; import java.io.UnsupportedEncodingException; public class Demo15 { public static void main(String[] args) throws UnsupportedEncodingException { String str = "你好ABC123"; byte[] b1 = str.getBytes();//转换成字节系列用的是项目默认的编码 for (

  • 【Java IO流】字节流和字符流的实例讲解

    字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作--也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3.从流的内容来讲,有字节和字符之分. 这篇文章先后讲解IO流中的字节流和字符流的输入和输出操作. 一.字节流 1)输入和输出流 首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream.OutputStream. InputStream抽象了应用程序读取数据的方式,即

  • Java IO流 File类的常用API实例

    •File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOException; public class Demo16 { public static void main(String[] args) { File file = new File("F:\\javaio"); //文件(目录)是否存在 if(!file.exists()) { /

  • Java IO流体系继承结构图_动力节点Java学院整理

    Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2. 原始处理器(适配器)与链接流处理器(装饰器) 其结构图如下: Reader-Writer体系 1. 基类 InputStream与OutputStream是所有字节型输入输出流的基抽象类,同时也是适配器(原始流处理器)需要适配的对象,也是装饰器(链接流处

随机推荐