1.异常

1.1什么是异常

异常字面翻译就是“意外、例外”的意思,也就是非正常情况。
异常本质上是程序上的错误。

1.2程序中的异常

  • 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。
  • 在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的。
  • 当程序在运行期间出现了异常,如果置之不理,程序可能会不正常运行、强制中断运行、造成用户数据丢失、资源无法正常释放、直接导致系统崩溃,显然这不是我们希望看到的结果。

1.3异常的分类

在程序开发中,异常指不期而至的各种状况。它是一个事件,当发生在程序运行期间时,会干扰正常的指令流程。
在Java中,通过Throwable及其子类描述各种不同的异常类型。

1.4Throwable有两个重要的子类:Exception 和 Error

1.4.1Error

Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
因此使用空的对象引用调用方法数组访问时下标越界我们编写程序时不需要关心这类异常。

1.4.2Exception

exception是程序本身可以处理的异常使用空的对象引用调用方法数组访问时下标越界。异常处理通常指针对这种类型异常的处理。
Exception类的异常包括 checked exception 和 unchecked exception。
1.unchecked exception

  • unchecked exception:编译器不要求强制处置的异常。
  • 包含RuntimeException类及其子类异常。
  • 如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是unchecked exception 。
  • Java编译器不会检查这些异常,在程序中可以选择捕获处理,也可以不处理,照样正常编译通过。
    2.checked exception
  • checked exception:编译器要求必须处置的异常。
  • 是RuntimeException及其子类以外,其他的Exception类的子类。
  • 如IOException、SQLException、FileNotFoundException等
    Java编译器会检查这些异常,当程序中可能出现这类异常时,要求必须进行异常处理,否则编译不会通过。
    1.5异常处理

1.5.1抛出异常

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

1.5.2捕获异常

  • 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。
  • 运行时系统从发生异常的方法开始,依次回查调用栈中的方法,当异常处理器所能处理的异常类型
  • 与方法抛出的异常类型相符时,即为合适的异常处理器。
  • 当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
  • 对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。
  • 总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的。简单地说,异常总是先被抛出,后被捕捉的

1.5.3异常处理
image.png
1.6 try-catch-finally 异常总结

处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常。
对于不确定的代码,也可以加上try-catch,处理潜在的异常
尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出。
具体如何处理异常,要根据不同的业务需求和异常类型去决定。
尽量添加finally语句块去释放占用的资源 。

1.7 throw & throws

  • 可以通过throws声明将要抛出何种类型的异常,通过throw将产生的异常抛出。
  • 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。
    例如:汽车在运行时可能会出现故障,汽车本身没办法处理这个故障, 那就让开车的人来处理。
  • throws语句用在方法定义时声明该方法要抛出的异常类型。
    2.包装类
  • 装箱:把基本数据类型转换成包装类
    – 自动装箱
    – 手动装箱
  • 拆箱:把包装类转换成基本数据类型
    – 自动拆箱
    – 手动拆箱
 –  基本数据类型转换为字符串
 –  使用包装类的  toString()  方法 
 static  void  j()  {
        Integer  i  =  10;
        String  iStr  =  i.toString();
        System.out.println(iStr);
    }
  • 字符串转换为基本数据类型
 –  自动拆箱调用包装类的  parseXxx()  静态方法
 –  调用包装类的  valueOf()  方法转换为基本类型的包装类,自动拆箱 
 static  void  k()  {
        String  str  =  "10";
        int  i    =  Integer.parseInt(str);
        System.out.println(i);
    }

3.字符串

3.1 创建String对象的方法

String s1="bsjava";
String s2=new String();
String s3=new String("bsjava")

3.2字符串StringBuilder

  • String和StringBuilder的区别: String具有不可变性,而StringBuilder不具备。
  • 建议: 当频繁操作字符串时,使用StringBuilder。
    StringBuilder和StringBuffer
  • 二者基本相似
    StringBuffer是线程安全的,StringBuilder则没有,所以性能略高
    在执行速度方面的比较:StringBuilder > StringBuffer
    4.集合

4.1 应用场景

  • 无法预测存储数据的数量
  • 同时存储具有一对一关系的数据
  • 需要进行数据的增删改查
  • 数据重复问题
  • 4.2 List(列表)
  • List是元素有序并且可以重复的集合,称为序列
  • List可以精确的控制每个元素的插入位置,或删除某个位置的元素
  • List的两个主要实现类是ArrayList和LinkedList

4.3ArrayList

  • ArrayList底层是由数组实现的
  • 动态增长,以满足应用程序的需求
  • 在列表尾部插入或删除非常有效
  • 更适合查找和更新元素
  • ArrayList中的元素可以为null
  • 4.4 Set

Set是元素无序并且不可以重复的集合,被称为集。

4.5HashSet

  • HashSet是Set的一个重要实现类,称为哈希集
  • HashSet中的元素无序并且不可以重复
  • HashSet中只允许一个null元素
  • 具有良好的存取和查找性能

4.6Iterator(迭代器)

  • Iterator接口可以以统一的方式对各种集合元素进行遍历
  • hasNext()方法检测集合中是否还有下一个元素
  • next()方法返回集合中的下一个元素

4.7Map

  • Map中的数据是以键值对(key-value)的形式存储的
  • key-value以Entry类型的对象实例存在
  • 可以通过key值快速地查找value
  • 一个映射不能包含重复的键
  • 每个键最多只能映射到一个值

4.8HashMap

  • 基于哈希表的Map接口的实现
  • 允许使用null值和null键
  • key值不允许重复
  • HashMap中的Entry对象是无序排列的

波波鱼
4 声望3 粉丝