博客
关于我
Java语言程序设计与数据结构(基础篇)第12章 异常处理和文本I/O 笔记
阅读量:675 次
发布时间:2019-03-15

本文共 5760 字,大约阅读时间需要 19 分钟。

Java语言程序设计与数据结构(基础篇)第12章 异常处理和文本I/O 笔记


一、引言

异常时运行时错误,异常处理使得程序可以处理运行时错误,并且继续通常的执行。在程序运行过程中,如果JVM检测出一个不可能执行的操作,就会出现运行时错误。运行时错误会作为异常抛出,异常就是一种对象,表示阻止正常运行的错误或者情况。如果异常没有被处理,那么程序将会非正常终止。


二、异常处理概述

1.异常简介

异常是从方法抛出的,方法的调用者可以捕获以及处理该异常。一个浮点数除以0是不会产生异常的。

2.异常处理的优点

  • 它能使方法抛出一个异常给它的调用者,并由调用者处理该异常。如果没有这个能力,那么被调用的方法就必须自己处理异常或终止该程序。
  • 被调用的方法通常不知道在出错的情况下该做些什么,这是库方法的通常情形。
  • 异常处理最根本的优势是将检测错误从处理错误中分离出来。

三、异常类型

  • 异常是对象,而对象都采用类来定义。异常的根类是java.lang.Throwable
  • ErrorExceptionRuntimeException有时候容易引起混淆。这三种类都是异常,这里讨论的错误都发生在运行时。
  • Throwable类是所有异常类的根,所有的Java异常类都直接或间接地继承自Throwable。可以通过继承Exception或者Error地子类来创建自己的异常。

四、异常类的三种主要类型

1.系统错误

系统错误由Java虚拟机抛出的,用Error类表示,Error类描述的是内部系统错误。

2.异常

异常是用Exception类表示的,它描述的是由你的程序和外部环境所引起的错误,这些错误能被程序捕获和处理。

3.运行时异常

运行时异常是用RuntimeException类表示的,它描述的是程序设计错误,运行时异常通常表明了编程错误。

4.免检异常和必检异常

  • RuntimeException类和Error类以及它们的子类都称为免检异常。
  • 所有其他异常都称为必检异常,意味着编译器会强制程序员检查并通过try-catch块处理它们,或者在方法头进行声明。
  • 免检异常可能在程序的任何一个地方出现,为避免过多地使用try-catch块,Java语言不强制要求编写代码捕获或声明免检异常。

五、异常处理模型基于的三种操作

  • 声明异常

    每个方法都必须声明它可能抛出的必检异常的类型,这称为声明异常。关键字throws用于声明异常。如果方法可能抛出多个异常,就可以在关键字throws后添加一个用逗号分隔的异常列表。如果父类中的方法没有声明异常,那么就不能在子类中对其重写时声明异常。

  • 抛出异常

    检测到错误的程序可以创建一个合适的异常类型的实例并抛出它,这称为抛出一个异常。

  • 捕获异常

    try-catch语句块是用来捕获异常的。如果在执行try块的过程中没有出现异常,则跳过catch子句。如果try块中的某条语句抛出一个异常,Java就会跳过try块中剩余的语句,然后开始处理这个异常的代码。异常处理器的代码称为异常处理器。

  • 从异常中获取信息

    使用Throwable类中的方法可以获取异常的详细信息。例如,getMessage()方法可以获取异常对象的信息,getStackTrace()方法可以获取异常的堆栈跟踪信息。

  • finally子句

    无论异常是否发生,finally子句总会被执行。finally子句可以用来执行一些必须在异常发生或不发生的情况下都要执行的代码。


  • 六、何时使用异常

    • 当错误需要被方法的调用者处理的时候,方法应该抛出一个异常。
    • try块包含正常情况下执行的代码。
    • catch块中包含异常情况下执行的代码。

    七、重新抛出异常

    如果异常处理器不能处理一个异常,或者只是简单地希望它的调用者注意到该异常,Java允许该异常处理器重新抛出该异常。


    八、链式异常

    链式异常是指一个异常被另一个异常包裹起来,形成一个链条。例如:

    try {    method1();} catch (Exception ex) {    throw new Exception("New info from method1", ex);}

    在上面的示例中,method1()抛出了一个异常,这个异常被method1()捕获后又抛出了一个新的异常。新的异常会包含原来的异常作为其原因。


    九、创建自定义异常类

    可以通过继承java.lang.Exception类来定义一个自定义异常类。例如:

    package com.java;public class InvalidRadiusException extends Exception {    private double radius;    public InvalidRadiusException(double radius) {        super("Invalid radius" + radius);        this.radius = radius;    }    public double getRadius() {        return radius;    }}

    十、File类

    File类提供了对文件和目录的操作。可以通过File类获取文件的属性,或者对文件进行改名和删除等操作。注意:File类不能直接读写文件内容。


    十一、文件输入和输出

    1.使用PrintWriter写数据

    package com.java;import java.io.File;import java.io.IOException;import java.io.PrintWriter;public class WriteDate {    public static void main(String[] args) throws IOException {        File file = new File("scores.txt");        if (file.exists()) {            System.out.println("File already exists");            System.exit(1);        }        try (PrintWriter output = new PrintWriter(file)) {            output.print("John T Smith ");            output.println(90);            output.print("Eric K Jones ");            output.println(85);            output.close();        }    }}

    2.使用try-with-resources自动关闭文件

    package com.java;import java.io.File;import java.io.PrintWriter;public class WriteDataWithAutoClose {    public static void main(String[] args) throws Exception {        File file = new File("myGirlFriend.txt");        if (file.exists()) {            System.out.println("File already exists");            System.exit(0);        }        try (PrintWriter output = new PrintWriter(file)) {            output.print("Name: ");            output.println("LiNa Wei");            output.println("Gender: Female");            output.println("Height: 162cm");            output.println("Weight: 50.5kg");        }    }}

    3.使用Scanner读取数据

    package com.java;import java.io.File;import java.util.Scanner;public class ReadData {    public static void main(String[] args) throws Exception {        File file = new File("scores.txt");        try (Scanner input = new Scanner(file)) {            while (input.hasNext()) {                String firstName = input.next();                String mi = input.next();                String lastName = input.next();                int score = input.nextInt();                System.out.println(firstName + " " + mi + " " + lastName + " " + score);            }        }    }}

    十二、从Web上读取数据

    可以通过URL类从Web上读取数据。例如:

    package com.java;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.util.Scanner;public class ReadFileFromURL {    public static void main(String[] args) throws Exception {        System.out.print("Enter a URL: ");        String urlStr = new Scanner(System.in).next();        try {            URL url = new URL(urlStr);            int count = 0;            try (Scanner input = new Scanner(url.openStream())) {                while (input.hasNext()) {                    String line = input.nextLine();                    count += line.length();                }                System.out.println("The file size is " + count + " characters");            }        } catch (MalformedURLException ex) {            System.out.println("Invalid URL");        } catch (IOException ex) {            System.out.println("I/O Errors: no such file");        }    }}

    十三、Web爬虫

    Web爬虫是一种用于自动遍历Web上的文档的程序。以下是一个简单的Web爬虫算法:

  • 将起始URL添加到一个待爬队列中。
  • 在队列不为空时,取出一个URL。
  • 如果该URL未被爬过,添加到已爬集合中,并显示该URL。
  • 解析该URL的页面,提取其子URL,并将未爬的子URL添加到队列中。

  • 十四、关键术语

    • 绝对文件名:文件的完整路径,依赖机器。
    • 链式异常:一个异常被另一个异常包裹。
    • 必检异常:必须在方法声明中声明。
    • 声明异常:在方法声明中使用throws关键字。
    • 目录路径:文件系统中的目录路径。
    • 异常传播:异常从方法传播到调用者。
    • 相对文件名:相对于当前工作目录的文件名。
    • 抛出异常:使用throw语句。
    • 免检异常:不需要在方法声明中声明。
    • 运行时异常:由RuntimeExceptionError类及其子类表示。

    十五、一些问题

  • 使用异常处理的优势

    异常处理允许方法向其调用方抛出异常,调用方可以处理异常。如果没有异常处理机制,被调用的方法必须自己处理异常或终止程序。

  • 声明异常的目的是什么,怎么声明,在哪里声明,可以声明多个么

    声明异常的目的是告诉Java运行时系统会出什么问题。在方法声明中使用throws关键字声明异常。可以声明多个异常用,隔开。

  • 什么是必检异常,什么是免检异常

    必检异常必须在方法声明中明确声明,必须在try-catch块中被捕获。免检异常不需要被声明,也不需要被捕获。Java中只有RuntimeExceptionError免检类及其子类免检。

  • 可以使用File类进行I/O么?创建File对象会在磁盘上创建一个文件么?

    不可以,File类用于获取文件属性和操作文件,但无法执行I/O操作。

  • 如何创建一个Scanner对象以从一个URL读取的文本

    首先创建一个URL类,然后使用scanner读取URL流中的数据。


  • 转载地址:http://umzqz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现文件传输(附完整源码)
    查看>>
    Objective-C实现文件分割(附完整源码)
    查看>>
    Objective-C实现文件拷贝(附完整源码)
    查看>>
    Objective-C实现文件断点传输(附完整源码)
    查看>>
    Objective-C实现文件的删除、复制与重命名操作实例(附完整源码)
    查看>>
    Objective-C实现无序表查找算法(附完整源码)
    查看>>
    Objective-C实现无锁链表(附完整源码)
    查看>>
    Objective-C实现无锁链表(附完整源码)
    查看>>
    Objective-C实现时间戳转为年月日时分秒(附完整源码)
    查看>>
    Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
    查看>>
    Objective-C实现显示响应算法(附完整源码)
    查看>>
    Objective-C实现晚捆绑测试实例(附完整源码)
    查看>>
    Objective-C实现普通矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
    查看>>
    Objective-C实现最优二叉搜索树算法(附完整源码)
    查看>>
    Objective-C实现最大和连续子序列算法(附完整源码)
    查看>>
    Objective-C实现最大最小距离算法(附完整源码)
    查看>>
    Objective-C实现最大的非常大的数字算法(附完整源码)
    查看>>
    Objective-C实现最大类间方差法OTSU算法(附完整源码)
    查看>>
    Objective-C实现最大非相邻和算法(附完整源码)
    查看>>