蓝旭第二次培训博客

本文详细介绍了Java中的异常处理机制,包括捕获、抛出异常,区分受检和未受检异常,以及自定义异常的创建。此外,还探讨了包装类、String和其子类、BigDecimal的使用,以及泛型、List、Set和Map的特性。
摘要由CSDN通过智能技术生成

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);
}

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值