蓝旭工作室后端第二周预习

异常类

什么是异常

        计算机运行过程中,会出现异常,有些是用户造成的,如系统想要输入一个‘int'类型变量,而用户却输入了’double‘类型。有些则是系统造成的,如网络断了,连接不到服务器。这些异常会导致程序终止,为了解决这些异常,java中提供了异常处理的相关流程。

        处理异常的步骤包括,定义异常类,抛出异常,捕获异常,处理异常。

捕获异常

try{...}catch{....}语句

其中把可能产生异常的语句放在try{...}中,然后使用catch捕获对应的异常。

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (IOException e) {
        System.out.println(e);
    } catch (NumberFormatException e) {
        System.out.println(e);
    }
}

一个try可以对应多个catch语句,每个catch语句捕获不同的异常。

finally语句

无论是否产生了异常,如果想要都执行一些语句,那么就可以把这些语句卸载finally里。

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (UnsupportedEncodingException e) {
        System.out.println("Bad encoding");
    } catch (IOException e) {
        System.out.println("IO error");
    } finally {
        System.out.println("END");
    }
}

如上代码,无论是否会产生异常,最后都会执行System.out.println("END")。

抛出异常

当发生错误时,我们就可以抛出异常,抛出异常的步骤:

1.创建异常类实例

2.用throw语句抛出

void process2(String s) {
    if (s==null) {
        NullPointerException e = new NullPointerException();
        throw e;
    }
}
//可简写
void process2(String s) {
    if (s==null) {
        throw new NullPointerException();
    }
}

可将异常转换:

void process1(String s) {
    try {
        process2();
    } catch (NullPointerException e) {
        throw new IllegalArgumentException();
    }
}

void process2(String s) {
    if (s==null) {
        throw new NullPointerException();
    }
}

process2语句抛出的NullPointerException被捕获转换成IllegalArgumentException。

自定义异常类

java中的异常类继承图

我们可以从这些定义异常类来继承这些异常类:

public class MyException extends RuntimeException{

}

包装类

我们已经知道,Java的数据类型分两种:

基本类型:byteshortintlongbooleanfloatdoublechar

引用类型:对象,字符串,数组等

通过包装类,我们可以把基本数据类型可以视为引用类型。

基本类型包装类
booleanjava.lang.Boolean
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
longjava.lang.Long
floatjava.lang.Float
doublejava.lang.Double
charjava.lang.Character

这些包装的类是java自身提供的,不需要自己去定义。

自动装箱/自动拆箱

以int型为例,int类型与Integer类型可以互相转换

int i = 100;
Integer n = Integer.valueOf(i);
int x = n.intValue();

int转换成integer类型称为自动装箱,反过来称为自动拆箱。

不变类

类似于String,包装类是不变类型,一旦被创建实例,那么赋值将不会改变。同时,包装类对象储存的是引用,不能用==比较,需要用.equals()比较

String(Builder/Buffer)类

java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。但是每次拼接都会产生新的字符串,这样极为浪费内存。因此java提供了StringBuilder,与String不同,StringBuilder是一个可变类,意味着添加字符并不会创建新的字符串。StingBuffer与StringBuilder类似。

BigDecimal类

BigDecimal是java提供的一个高精度计算浮点数的类。类内提供了许多数学运算,如加法,乘法等。BIgDecimal类是不可变的,

泛型

什么是泛型

为了代码的复用性,我们在编写类时,为了能够一次编写,任何类型都可以用。例如:

public class ArrayList<T> {
    private T[] array;
    private int size;
    public void add(T e) {...}
    public void remove(int index) {...}
    public T get(int index) {...}
}

通过这种模板来实现泛型,我们在使用过程中就可以不用为每一种类型都写一种类。

List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");

编写泛型

public class Pair<T> {
    private T first;
    private T last;
    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() {
        return first;
    }
    public T getLast() {
        return last;
    }
}

<T>代表我们所需的数据类型。

列表

java中列表储存一个有序的序列,这个序列中存在相同元素。java中的列表包括ArrayListLinkedListVector等。

List<String> list = new ArrayList<>();  
          
        // 添加元素  
        list.add("Apple");  
        list.add("Banana");  
        list.add("Cherry");  
          
        // 获取并打印元素  
        System.out.println("Element at index 1: " + list.get(1)); // 输出: Element at index 1: Banana  
          
        // 修改元素  
        list.set(1, "Blueberry");  
        System.out.println("Updated element at index 1: " + list.get(1)); // 输出: Updated element at index 1: Blueberry  
          
        // 删除元素  
        list.remove(0);  
        System.out.println("List after removing element at index 0: " + list); // 输出: List after removing element at index 0: [Blueberry, Cherry]  
          
        // 打印列表大小  
        System.out.println("Size of list: " + list.size()); // 输出: Size of list: 2  

Set

与列表相反,set是一个无序的序列,其中的元素不能重复。

Set<String> set = new HashSet<>();  
          
        // 添加元素  
        set.add("Apple");  
        set.add("Banana");  
        set.add("Cherry");  
        set.add("Apple"); // 这个添加操作不会有效果,因为Set不允许重复元素  
          
        // 检查元素是否存在  
        System.out.println("Does set contain 'Apple'? " + set.contains("Apple")); // 输出: true  
          
        // 删除元素  
        set.remove("Banana");  
        System.out.println("Set after removing 'Banana': " + set); // 输出: [Cherry, Apple]  
          
        // 打印集合大小  
        System.out.println("Size of set: " + set.size()); // 输出: 2  
          
        // 打印集合内容(不保证顺序)  
        System.out.println("Set contents: " + set); // 输出可能是: [Cherry, Apple] 或 [Apple, Cherry] 等 

Map

map中储存的是健值对,一个键对应一个值。

 Map<String, Integer> map = new HashMap<>();  
          
        // 添加键值对  
        map.put("Apple", 1);  
        map.put("Banana", 2);  
        map.put("Cherry", 3);  
          
        // 通过键获取值  
        Integer value = map.get("Banana");  
        System.out.println("Value for 'Banana': " + value); // 输出: 2  
          
        // 检查键是否存在  
        System.out.println("Does map contain key 'Apple'? " + map.containsKey("Apple")); // 输出: true  
          
        // 删除键值对  
        map.remove("Cherry");  
        System.out.println("Map after removing 'Cherry': " + map); // 输出: {Apple=1, Banana=2}  
          
        // 打印映射大小  
        System.out.println("Size of map: " + map.size()); // 输出: 2  
          
        // 打印映射内容  
        System.out.println("Map contents: " + map); // 输出可能是: {Apple=1, Banana=2} 或其他顺序,因为HashMap不保证顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值