1.捕获、抛出、自定义异常类
异常
定义:是指程序中出现的不期而至的各种状况,在程序运行期间,它影响了正常的程序执行流程,
也就是运行时的问题。在Java中,把异常封装成了一个类,当出现问题时,就会创建对象并抛出异常相关的信息。
分类:异常可以分为两种主要类型:受检异常(Checked Exceptions)和未受检异常(Unchecked Exceptions)。
1、捕获异常
Java中用try...catch...finally处理异常:
-
try:该代码块中编写可能产生异常的代码。
-
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
-
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
try {
// 可能会抛出异常的代码块
int result = divide(10, 0);
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
// 捕获并处理异常
System.err.println("Error: " + e.getMessage()); // 打印异常信息
e.printStackTrace();
} finally {
// finally块中的代码始终会执行,无论是否抛出异常
System.out.println("Finally block executed.");
}
2、抛出异常
在java中,提供了一个throw关键字,用来抛出一个指定的异常。
使用方法:
1.创建一个异常对象。封装一些提示信息
2.将这个异常告知调用者 使用格式: throw new 异常类名(参数);
声明异常格式: 修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{ }
throw new ExceptionType("Error message");
3、自定义异常
对于某些数据我们有特殊要求,例如输入数字300是正常的,但如果需要的是身高,那么超过250就是异常,此时Java内置的异常类无法满足特定的需求,可以创建自定义的异常类。自定义异常类通常继承自Java提供的异常类,比如Exception或RuntimeException。
格式:
Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
public class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
2.包装类、 String(buffer、builder)、BigDecimal
包装类
在Java中,包装类(Wrapper Classes)是一组类,它们将基本数据类型(如int、char、boolean等)包装成对象。这些包装类提供了一系列方法来操作基本数据类型的值,并且它们通常用于泛型、集合类和其他需要对象而不是基本数据类型的情况下。
如
1.Integer: 包装int类型的值,并提供了与int类型相关的方法。
2.Long: 包装long类型的值,并提供了与long类型相关的方法。
3.Float: 包装float类型的值,并提供了与float类型相关的方法。
4.Double: 包装double类型的值,并提供了与double类型相关的方法。
Integer类的compareTo()方法:
Integer num1 = 10;
Integer num2 = 5;
int comparison = num1.compareTo(num2);
System.out.println(comparison); // 输出:1 (num1大于num2)
String(buffer、builder)
String类和StringBuffer的对比
相同点:都用于保存字符串,都可以对字符串进行一些增删或其他处理的操作
不同点:
- String类用于保存字符串常量
- StringBuffer类用于保存字符串变量
(StringBuffer类创建对象只能通过调用构造器创建对象!)
以下是String、StringBuffer和StringBuilder的常见使用方法示例:
String:String str = "Hello";// 创建字符串
StringBuffer
StringBuffer buffer = new StringBuffer("Hello");// 创建StringBuffer对象
buffer.append(" World");// 追加字符串
StringBuilder:
StringBuilder builder = new StringBuilder("Hello");// 创建StringBuilder对象
线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
操作少量的数据: 适用String
单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer
(效率:StringBuilder>StringBuffer>String)
高精度数据类型,它可以处理任意精度的数值,避免了使用基本数据类型(如double、float)进行浮点数计算时可能出现的精度丢失问题。
示例用法:
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("5.3");// 加法
BigDecimal sum = num1.add(num2); // 结果为15.8// 减法
BigDecimal difference = num1.subtract(num2); // 结果为5.2
3.泛型 简介、列表、set、map
1.泛型(Generics):
在Java中,泛型(Generics)是一种编程机制,允许你在编写类、接口和方法时使用参数化类型。它提供了编译时类型安全性,使得代码更加灵活和可重用。Java中常见的泛型容器有Map、List和Set。泛型允许你在编写代码时指定类型的参数,从而增强了代码的类型安全性和可读性。使用泛型可以避免在运行时进行类型转换,并在编译时捕获可能的类型错误。泛型的基本语法如下:
2.Map:
Map是一种键值对(Key-Value)的集合,它将键映射到值。在Java中,Map接口的常见实现类有HashMap、TreeMap和LinkedHashMap等。Map中的键是唯一的,但值可以重复。例如,你可以使用Map来表示学生的成绩表,其中学生的姓名作为键,成绩作为值。
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> map = new HashMap<>();map.put("One", 1);
map.put("Two", 2);
map.put("Three", 3);int value = map.get("Two");
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
3.列表(List):
列表是一种有序集合,允许元素重复。在Java中,List接口的常见实现类有ArrayList、LinkedList和Vector等。列表允许通过索引访问元素,并提供了一系列操作元素的方法,如添加、删除、获取元素等。例如,你可以使用列表来存储一组学生的姓名。
import java.util.ArrayList;
import java.util.List;List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
String firstElement = list.get(0); // 返回"Apple"
for (String fruit : list) {
System.out.println(fruit);
}
4.集(Set):
集是一种不允许重复元素的集合。在Java中,Set接口的常见实现类有HashSet、TreeSet和LinkedHashSet等。集通常用于存储唯一的元素,它提供了添加、删除、检查元素是否存在等操作。例如,你可以使用集来存储一组唯一的标签或关键词。
这些泛型容器提供了不同的数据结构和功能,可以根据具体的需求选择合适的容器。使用泛型可以使代码更加灵活和通用,同时提高了代码的类型安全性。
import java.util.HashSet;
import java.util.Set;Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
for (Integer num : set) {
System.out.println(num);
}