Java异常

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

  • Error:较为严重的错误,一般指JVM之类的错误或内存泄漏等错误
  • Exception

    • checked exception
      • 编译器要求必须要处理的异常
      • 除RuntimeException及其子类除外,其他的Exception类及其子类
      • 如IO异常,SQL异常等
    • unchecked exception
      • 编译器不要求强制处置的异常
      • 包含RuntimeException类及其子类的异常
      • 例如空指针、下标越界异常
      • 可以捕获,也可以不处理,编译不会报错

        异常处理

        异常总是先被抛出后被捕获的
  • 抛出异常

  • 捕捉异常
  • 异常处理
    • try:执行可能产生异常的代码
    • catch:捕获异常
    • finally:无论是否发生异常代码总能执行
    • throw:手动抛出异常
    • throws:声明可能要抛出的异常
  • throw&throws
    • 可以通过throws声明要抛出何种类型的异常,通过throw将产生的异常抛出
    • 方法可以不处理可能存在异常的代码,将异常抛出给调用该方法的人去处理该异常(try-catch-finally)
    • 如果是unchecked Exception,那么可以不使用throws声明要抛出的异常,编译通过,但运行时会被系统抛出
    • checked Exception必须处理异常或重新抛出异常,否则编译报错
    • 方法抛出的异常,该方法的调用者必须处理或重新抛出异常
    • 子类重写父类抛出异常的方法时,声明的异常必须是父类方法所声明异常的父类或子类
    • throw用来抛出异常 ```java public void method() throws Exception1,Exception2,…,ExceptionN{ //可能产生异常的代码 }

public void method() throws 异常类型{ //代码段 throw new 异常类型(); }

  1. <a name="Kb4wf"></a>
  2. ### 自定义异常
  3. - 对于特定业务可以自定义异常来处理
  4. - 定义一个类去继承Throwable类或其子类
  5. ```java
  6. public class MyException extends Throwable{
  7. public MyException(){
  8. super("自定义异常类");
  9. }
  10. }

异常链

  • 有时候我们会捕获一个异常再抛出一个新的异常
  • 将异常发生的原因一个传一个串起来,即把底层的信息传给上层,这样逐层抛出
  • Throwable的构造方法可以传一个cause接收上层的异常信息

    Java包装类

    包装类与基本数据类型

  • 装箱

    • 自动装箱:Integer n = 10;
    • 手动装箱:Integer n = valueOf(10);
  • 拆箱

    • 自动拆箱:Integer x = 10; int n = x;
    • 手动拆箱
      1. public static Integer valueOf(int i) {
      2. return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
      3. }

      字符串与基本数据类型

  • 基本数据类型 -> 字符串:使用包装类的toString()方法

  • 字符串 -> 基本数据类型

    • 自动拆箱调用包装类的parseXxx()静态方法
    • 调用包装类的valueOf()方法转换为基本数据类型的包装类,自动拆箱

      Java字符串

      String

      如何创建String对象

  • String s1 = “Hello”;

  • String s1 = new String();
  • String s1 = new String(“Hello”);

    String对象的常用方法

    QQ截图20210721111538.png

    ==和equals()方法的区别

    QQ截图20210721112045.png

    字符串的不可变性

    String && StringBuffer && StringBuilder

  • String不可变,StringBuffer、StringBuilder可变

  • 当对字符串频繁操作时使用StringBuffer或StringBuilder
  • StringBuffer和StringBuilder二者基本相似
  • StringBuffer线程安全,StringBuilder线程不安全
  • StringBuilder > StringBuffer(速度)
  • 常用方法

    • StringBuilder append(参数)
    • StringBuilder insert(位置,参数)
    • String toString()
    • int length()

      Java集合

      List

  • List是元素有序且可以重复的集合,称为序列

  • List可以精确控制元素插入的位置和删除某个位置的元素
  • 两个主要的实现类:ArrayList和LinkedList

    ArrayList

  • 底层是数组

  • 动态增长
  • 尾部插入删除非常有效
  • 适合查看和更新元素
  • 元素可以为null

    LinkedList

  • 底层是链表

  • 适合插入、删除元素

    Set

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

    HashSet

  • 是Set的一个重要实现类,称为哈希集

  • 无序且不可重复
  • 只允许一个null元素
  • 具有良好的存取和查找性能
  • 底层是HashMap(链表+数组+红黑树)

    Iterator(迭代器)

  • 统一的方式对各种集合元素进行遍历(Collection)

  • hasNext()检测是否还有下一个元素
  • next()返回下一个元素

    1. Iterator<String> it = set.iterator();
    2. while(it.hasNext()){
    3. System.out.println(it.next()+" ");
    4. }

    Map

  • 键值对形式存储(key-value)

  • key-value以Entry类型的对象实例存在
  • 可以通过key找到value
  • 一个映射不能包含重复的键
  • 每个键对应一个值

    HashSet

  • 实现Map接口

  • 允许使用null键和null值
  • key不允许重复
  • Entry对象是无序排列的

    集合排序

    集合中的基本数据类型排序

  • 使用Collections类中sort()方法

  • sort(List list) - 根据元素的自然顺序对指定列表按照自然升序进行排序

    集合中的字符串排序

    同样和基本数据类型排序一样:使用Collections类中sort()方法

    Comparator接口

  • 可以自定义一个比较器

  • 强行对某个对象进行整体排序的比较函数
  • 可以将Comparator传递给sort方法(如Collections.sort()或Arrays.sort())

    1. public Class Cat{
    2. private int age;
    3. private String name;
    4. ...
    5. }
    6. public CatComparator implements Comparator<Cat>{
    7. public int compare(Cat c1, Cat c2){
    8. return c1.age - c2.age;
    9. }
    10. }
    11. public static void main(String[] args){
    12. List<Cat> list = new ArrayList<Cat>;
    13. Iterator it = list.iterator();
    14. while(it.hasNext()){
    15. System.out.print(it.next() + " ");
    16. }
    17. //这里的比较器可以写成匿名内部类的形式
    18. Collections.sort(list,new CatComparator());
    19. it = list.iterator();
    20. while(it.hasNext()){
    21. System.out.print(it.next() + " ");
    22. }
    23. }

    Comparable接口

  • 需要排序的类实现Comparable接口,并重写compareTo方法

  • 类的compareTo方法被称为它的自然比较方法
  • 对于集合,通过调用Collections.sort方法
  • 对于数组,通过调用Arrays.sort方法
    1. public Class Cat implements Comparable<Cat>{
    2. private int age;
    3. private String name;
    4. ....
    5. public int compareTo(Cat c){
    6. return this.age - c.age;
    7. }
    8. }