1.异常的概念:在Java语言中,异常又称“例外”,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。
Java中的异常用对象来标识。Java对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型,每个异常都对应一个异常对象。
异常的来源有:Java语言本身定义的一些基本异常类型。
用户通过继承Exception类或者其子类自己定义的异常。Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序需要捕获的异常条件。
Java运行时程序自动抛出的异常,不管是否捕获或者处理,它总会抛出异常。比如当除数为0时抛出的异常。
开发者自己抛出的异常,这个异常可以是开发者自己定义的,也可以是Java语言中定义的,用throw关键字抛出异常,这种异常用来向调用者汇报异常的一些信息。
2.异常处理机制:Java的异常处理机制提供一种结构性和控制性的方式来处理程序执行期间发生的事件。
异常处理机制方式:在方法中用try-catch语句捕获并处理异常,catch语句可以有多个,用来匹配多个异常。
对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常,即由上层的调用方法。
try{逻辑程序块 }catch(ExceptionType1 e1){ 处理代码块1 }catch(ExceptionType2 e2){ 处理代码块2 }finally{ 释放资源代码块 }
3.异常类型
在Java中,任何异常对象都是java.lang.Throwable类或其子类的对象,即所有异常类型都是内置类Throwable的子类。
(1).Error类
指一些无法恢复的严重的错误,如系统崩溃、虚拟机出错误、动态链接失败等,这类错误将导致应用程序中断,通常不由程序处理,用户也无法捕获。
(2).Exception类
指由程序和外部环境引起的错误,它是可以被捕获且可能恢复的异常情况,包括RuntimeException类和其他Exception类。
RuntimeException类
表示编程时存在的隐患或错误在运行期间所产生的异常
RuntimeException类异常的产生是程序员的过失,理论上,程序员经过检查和测试可以查出这类错误。
其他Exception类
其他Exception类异常通常由环境因素引起,如文件不存在、无效的URL等。
4.异常处理
(1).使用try-catch语句捕获异常
语法格式如:
try{ 逻辑代码块1; }catch(ExceptionType e){ 处理代码块 1; }
import java.util.Scanner; public class TryCatchDemo { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); System.out.println("------学生信息录入------------"); String name=""; int age =0; String sex=""; try { System.out.println("请输入学生的姓名:"); name=scanner.next(); System.out.println("请输入学生年龄:"); age = scanner.nextInt(); System.out.println("请输入学生的性别:"); sex = scanner.next(); }catch(Exception e) { e.printStackTrace(); System.out.println("输入有误!"); } System.out.println("姓名:"+name); System.out.println("年龄:"+age); System.out.println("性别:"+sex); } }
在以上语法的处理代码块1中,可以使用以下方法输出相应的异常信息
printStackTrace()方法 指出异常的类型、性质、栈层次及出现在 程序中的位置。
getMessage()方法 输出错误的性质。
toString()方法 给出异常的类型与性质。
注意:catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须为Throwable类的子类,它指明了catch语句可以处理的异常类型,异常对象则由运行时系统在try语句块中生成并被捕获。
一个catch语句也可以捕捉多个异常类型,这时类型的参数应该是这多个异常类型的父类,程序设计中要根据具体的情况来选择catch语句的异常处理类型。
(2).使用多重catch语句捕获异常
语法结构如下:
try{ 逻辑代码块; }catch(ExceptionType e1){ 处理代码块 1; }catch(ExceptionType e2){ 处理代码块 2; } ..... }catch(ExceptionType en){ 处理代码块 n; }
(3).使用try-catch-finally语句捕获异常
在实际开发中,根据try-catch语句的执行过程,try语句块和catch语句块有可能不被完全执行,而有些处理代码则要求必须执行,例如文件的关闭、释放资源等,此时就可以将这些代码放在finally语句块中。
语法格式如下:
try{ 逻辑代码块; }catch(ExceptionType e){ 异常处理代码块 }finally{ 清理代码块 }
import java.util.InputMismatchException; import java.util.Scanner; public class CatchDemo { public static void main(String[] args) { Scanner input = new Scanner (System.in); try { System.out.println("请输入班级总人数:"); int count =input.nextInt(); System.out.println("请输入总成绩:"); int score = input.nextInt(); int avg =score/count; System.out.println("本次考试的平均分:"+avg); }catch (InputMismatchException e1) { System.out.println("输入数值有误!"); }catch (AirthmeticException e2) { System.out.println("输入总人数不能为0!"); }catch (Exception e3) { e3.printStackTrace(); System.out.println("发生错误!"e3.getMessage()); } } }
finally与try语句块匹配的语法格式不常见,因为此情况会导致异常丢失。
4.声明异常和抛出异常
(1).throws声明异常
当一个方法产生一个它不处理的异常时,就需要在该方法的头部声明这个异常,以便于将该异常传递到方法的外部去进行处理。可以使用throws关键字在方法的头部声明一个异常。
在编写类继承代码时要注意,子类在覆盖父类带throws字句的方法时,子类的方法声明中的throws字句不能出现父类对应方法的throws字句中没有的异常类型,因此throws字句可以限制子类的行为。也就是说子类方法抛出的异常处理不会超过父类定义的范围。
(2).throw抛出异常
throw语句用来直接抛出一个异常,后接一个可抛出的异常对象。语法格式如下:
throw ExceptionObject;
ExceptionObject必须是Throwable类或其子类的对象。如果是自定义异常类也必须是Throwable的直接或间接子类。
5.自定义异常
如果Java提供的系统异常类型不能满足程序设计的需求,用户可以设计自己的异常类型。自定义异常类必须继承现有的Exception类或Exception的子类来创建。语法格式如下:
<class><myException><extends><Exception>
1.集合概述
Java集合框架提供了一套性能优良、使用方便的接口和类。一个集合是一个对象,它表示了一组对象。Java集合中实际存放的是对象的引用值,不能存放基本数据类型值。
框架是一个类库的集合。集合框架是一个用来表示和操作集合的统一的架构,包含了实现集合的接口和实现类。
(1).Set接口
Set接口也实现了Collection接口,为无序集合,它不能包含重复的元素。实现Set接口的常用类有HashSet和TreeSet。它们都可以容纳所有类型的对象,但不保证序列顺序恒久不变。
Collection接口是最基本的集合接口,一个Collection代表一组元素。
(2).List接口
List接口实现了Collectiom接口,为有序集合,允许有相同的元素。使用List能够精确地控制每个元素插入的位置。
ArrayList 实现了可变大小的数组。它的优点在于遍历元素和随机访问元素的效率比较高。
LinkedList 提供了额外的addFrist()、addLast()、removeaFirst()、removeaLast()等方法,可以在LinkedList 的首部或尾部进行插入或者删除操作。这些方法使得LinkedList 可被用作堆栈(stack)或者队列(queue)。
(3).Map
Map是一种键-值对(key-value)集合。实现Map接口的常用类有HashMap和TreeMap,它们用于存储键到值映射的对象。
HashMap 按哈希算法来存取键对象。
TreeMap 可以对键对象进行排序。
2.Collection接口
Collection接口是List接口和Set接口的父接口,该接口中提供了List集合与Set集合的通用方法。
3.无序列表——Set集合
(1).HashSet类
HashSet类是按照哈希算法来存储集合中的元素的,使用哈希算法可以提高集合元素的存储速度,当向set集合中添加一个元素时,HashSet会调用该元素的hashCode()方法,获取其哈希码,然后根据这个哈希码计算出该元素在集合中的存储位置。
package com.mxl.connection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class HashSetDemo { private static final String String = null; public static void main(String[] args) { Set<String> userSet=new HashSet<String>(); String user1 = new String("王丽丽"); String user2 = new String("马腾"); String user3 = new String("张辉"); String user4 = new String("张芳"); userSet.add(user1); userSet.add(user2); userSet.add(user3); userSet.add(user4); System.out.println("新进员工有:"); Iterator<String> it= userSet.iterator(); while(it.hasNext()) { System.out.println((String)it.next()); } System.out.println("共招进"+userSet.size()+"人!"); } }
(2).TreeSet类
TreeSet类不仅实现了Set接口,还实现了SortedSet接口,SortedSet接口时Set接口的子接口,可以对集合进行自然排序,因此使用TreeSet类实现的Set集合在默认情况下是自然排序的,这里的自然排序指的是升序排序。
在使用自然排序时,只能向TreeSet集合中添加相同数据类型的对象,否则会抛出ClassCastException异常。如果向TreeSet集合中添加了一个Double类型的对象,则后面只能添加Double对象,不能再添加其他类型的对象。
4.有序列表——List集合
(1).Arraylist类
Arraylist类提供了快速的基于索引的成员访问方式,对尾部成员的增加和删除支持较好。使用Arraylist创建的集合,允许对集合中的元素进行快速的随机访问,不过,向Arraylist中插入与删除元素的速度相对较慢。
Arraylist() 构造一个初始容量为10的空列表。
Arraylist(Collection<?extends E>c) 构造一个包含指定Collection的元素的列表,这些元素时按照该Collection的失代器返回它们的顺序排列的。
(2).LinkedList类
使用LinkedList集合,可以对集合的首部或尾部进行插入或者删除操作。而且,相对与LinkedList,在插入或者删除元素时,LinkedList提供了更好的性能,但是随机访问元素的速度则相对较慢。
public class LinkedList { public static void main(String[] args) { LinkedList <String>students= new LinkedList<String>(); String stu1 = new String("王丽丽"); String stu2 = new String("马腾"); String stu3 = new String("张辉"); students.add(stu1); students.add(stu2); students.add(stu3); String stu4 =new String("张芳"); students.addLast(stu4); System.out.println("******学生信息********"); System.out.println("目前学生有:"); for(int i=0; i<students.size();i++) { System.out.print(students.get(i)+"\t"); } System.out.println("\n第一个报到的学生为:"+students.getFirst()); System.out.println("最后一个报到的学生为:"+students.getLast()); students.removeLast(); System.out.println("删除最后报到的学生,目前学生有:"); for(int i=0;i<students.size();i++) { System.out.print(students.get(i)+"\t"); } } }