首页 > 学院 > 开发设计 > 正文

第7章 异常

2019-11-14 12:24:00
字体:
来源:转载
供稿:网友

7.1异常概述

1.所有异常的父类是?所有异常都在哪个包里?所有异常分为几种类型?

java 语言定义了一些异常类在java.lang 标准包中。

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

在 Java 内置类中,有大部分常用检查性和非检查性异常。

1.   从编程角度异常又分为哪两种?各自的含义及常用异常类有哪些?

通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(uncheckedexceptions)。

     可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。

     除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

     不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

    Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

      运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

      非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

3.Java的异常处理机制有几种?

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

7.2 捕获异常

1.异常捕获的语句有哪些?异常捕获的目的是什么?如何捕获异常?

捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。

捕获异常:try、catch 和 finally

try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。

catch 块:用于处理try捕获到的异常。

finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

如何释放物理资源?

Close

1.   什么情况下,finally语句块会执行,什么情况下不会执行?

当程序执行try块,catch块时遇到return语句或者throw语句,这两个语句都会导致该方法立即结束,所以系统并不会立即执行这两个语句,而是去寻找该异常处理流程中的finally块,如果没有finally块,程序立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用 再跳回去执行try块、catch块里的任何代码了。

在以下4种特殊情况下,finally块不会被执行:

1)在finally语句块中发生了异常。

2)在前面的代码中用了System.exit()退出程序。

3)程序所在的线程死亡。

4)关闭CPU。

 

3.try、catch、finally、throw、throws的作用分别是什么?多catch语句之间的执行顺序?

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

try

{

   //程序代码

}catch(ExceptionName e1)

{

  //Catch 块

}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

 

一个 try 代码块后面跟随多个catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

try{

   //程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}

上面的代码段包含了 3 个 catch块。

可以在 try 语句后面添加任意数量的catch 块。

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块。

 

如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

import java.io.*;public class className{ public void deposit(double amount) throws RemoteException  {   // Method implementation   throw new RemoteException();  } //Remainder of class definition}

一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

 

finally 关键字用来创建在try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在catch 代码块最后,语法如下:

try{

  // 程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}finally{

  // 程序代码

}

7.3抛出异常

1.什么是抛出异常?什么情况下需要抛出异常?抛出异常后如何处理?

抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

抛出异常:throw、 throws

7.4自定义异常

1.如何自定义异常?自定义的异常如何处理?

编写自己的异常类时需要记住下面的几点。

所有异常都必须是 Throwable 的子类。

如果希望写一个检查性异常类,则需要继承 Exception 类。

如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

可以像下面这样定义自己的异常类:

class MyException extends Exception{

}

只继承Exception 类来创建的异常类是检查性异常类。

一个异常类和其它任何类一样,包含有变量和方法。

7.5集合概述

1.什么是集合? Java中常用的集合有哪几类?集合中用来存放什么?集合与数组的区别?

集合类存放于java.util包中。

集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。

集合类型主要有3种:set(集)、list(列表)和map(映射)。

 

通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

一、数组声明了它容纳的元素的类型,而集合不声明。

    二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

    三、数组不论是效率还是类型检查都是最好的。

1.数组是大小固定的,一旦创建无法扩容;集合大小不固定,

2.数组的存放的类型只能是一种,集合存放的类型可以不是一种(不加泛型时添加的类型是Object);

3.数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查(不懂),都是最快的.

 ArrayList就是基于数组创建的容器类.

2.各类集合中元素存与取的特点?如何定义一个集合?

List 有序,可重复。Set 无序,唯一

Map(双列集合)

    A:Map集合的数据结构仅仅针对键有效,与值无关。

    B:存储的是键值对形式的元素,键唯一,值可重复。

 

7.6集合类

1.List接口的实现方式?如何定义一个list集合?

6.List集合的特点?7.List集合中常用的方法有哪些?

 

List:、有顺序以线性方式存储,可以存放重复对象

ArrayList:

底层的数据结构是数组;所以它查询快,增删慢!

线程不安全,但是效率高!

Vector:

底层的数据结构是数组;所以它查询快,增删慢!

线程安全,但是效率低!

LinkList:

底层的数据结构是链表,所以它查询慢,但是增删快!

线程不安全,但是效率高!

 

7.7集合工具类

1.集合的工具类有哪些?

1. 类Collections 是集合框架的工具类,其中的方法都是静态方法。 2. 调用某个方法直接利用类名调用即可,如Collections.sort(list1);。

 

8、用来排序的集合工具类是什么?如何使用其中的方法?

java.util.Arrays类

 

提供了各种对象的排序:char[],byte[],long[],int[]和Object[],注Arrays.sort方法排序返回的结果是升序Ascending的排列顺序。你可以定制排序顺序。这个排序和TreeSet的红黑树排序方式不同,Set不允许有重复数据存在,因此,当有重复数据时,可以使用这个工具类进行排序。Arrays提供的排序算法是归并排序算法(当元素数量小于=7时采用的是插入排序),空间复杂度O(n)。

 

.java.util.Collections类

 

该工具类提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表