在Java中,异常处理是程序设计中非常重要的一部分,它允许程序在运行时遇到问题时能够以一种有组织、可预测的方式处理这些问题,而不是直接崩溃。Java中的异常处理主要涉及两个方面:
抛出异常和捕获异常。
抛出异常
在Java中,当某个方法遇到问题时,它可以创建一个异常对象并“抛出”它。这可以通过使用throw
关键字来完成。通常,这些问题可能是无法由该方法处理的错误情况,因此它将这些情况传递给调用它的代码。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误
如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出
的异常。
例如,假设我们有一个方法,它试图从一个文件中读取数据,但文件不存在。在这种情况下,该方法可能会抛出一个FileNotFoundException
异常:
注意,throw
关键字用于在方法签名中声明该方法可能抛出的异常。调用这个方法的代码需要处理这个异常,要么通过捕获它,要么通过在其自己的方法签名中声明它也抛出这个异常。
捕获异常
当一个方法抛出一个异常时,调用它的代码必须处理这个异常。这可以通过使用try-catch
语句来完成。try
块包含可能抛出异常的代码,而catch
块包含处理该异常的代码。
以下是一个捕获的例子:
下面的例子中声明有两个元素的一个数组,当代码试图访问数组的第四个元素的时候就会抛出一个异常。
以上代码编译运行输出结果如下:
自定义异常类
在Java中,自定义异常类允许创建在特定于你的应用程序或库的异常类型。这有助于提供更清晰、更具体的错误信息,并使得代码更易于维护和调试。要创建自定义异常类,需要继承自Exception
类或其子类(如RuntimeException
)。自定义异常类通常包含描述错误情况的字段和方法。
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
包装类(Wrapper Classes)
在Java中主要起到两个作用:将基本数据类型封装成对象,以便能使用对象所特有的方法;在集合类框架中作为基本数据类型和对象之间的桥梁,因为集合类框架只允许对象类型的元素。
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
输出:
在上面的StringBuilder
和StringBuffer
示例中,我们使用了append
方法来连接字符串,append 是 StringBuffer
和 StringBuilder
类中的一个方法,用于在字符串缓冲区的末尾添加指定的内容。
BigDecimal 类
BigDecimal
类是Java提供的一个用于高精度计算的类,它可以用来表示、比较以及执行数学运算的、不可变的、任意精度的有符号十进制数。
输出:
在上述代码中import java.math.BigDecimal;
这行代码导入了java.math
包中的BigDecimal
类。
泛型简介
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。
那参数化类型是什么?以方法的定义为例,在方法定义时,将方法签名中的形参的数据类型也设置为参数(也可称之为类型参数),在调用该方法时再从外部传入一个具体的数据类型和变量。
泛型的本质是为了将类型参数化, 也就是说在泛型使用过程中,数据类型被设置为一个参数,在使用时再从外部传入一个数据类型;而一旦传入了具体的数据类型后,传入变量(实参)的数据类型如果不匹配,编译器就会直接报错。这种参数化类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
——泛型简介来源于:Java 中的泛型(两万字超全详解)_java 泛型-CSDN博客
泛型的主要使用场景
- 集合类:如
List
、Set
、Map
等,使用泛型可以避免运行时类型转换异常,并提高代码的可读性。 - 自定义泛型类:可以创建自己的泛型类,用于封装多种数据类型的对象。
- 泛型方法:可以在方法中定义类型参数,使得方法能够处理多种类型的参数。
列表
输出:允许存储重复值。
Set:
输出:
Set
是一个无序的集合,不允许存储重复的元素。
Map:
是一个存储键值对的集合,键是唯一的,但值可以重复。
在键值对中:
- 键(Key):是唯一的标识符,用于查找或定位特定的数据项。键必须是唯一的,不能有重复。
- 值(Value):是与键相关联的数据。一个键只能对应一个值,但不同的键可以对应相同的值。
这里, Map.Entry<String,Integer>是 Map 接口中的一个内部接口,它表示一个键值对。在这个例子中,键的类型是 String ,值的类型是 Integer 。entry 是循环变量,在每次迭代中,它会被赋值为 map 中的一个键值对。
在循环体中,我们访问了entry
对象的键和值,并打印出来。
entry.getKey()
:返回当前键值对的键。entry.getValue()
:返回当前键值对的值。