常用工具类

115 阅读6分钟

程序异常

程序异常是指程序在执行过程中遇到了无法处理的错误,导致程序不能正常运行或者出现不可预测的结果。异常可能是由于输入错误、资源不足、程序bug等原因引起的。在编程中,通常会使用异常处理机制来捕获和处理这些异常,以保证程序的稳定性和健壮性。常见的异常包括空指针异常、数组越界异常、文件不存在异常等。处理异常的方式一般包括捕获异常并进行恰当的处理、记录异常信息以便排查错误、抛出异常以通知调用者等。

常见的异常分类

image.png 常见的异常类型包括以下几种:

  1. NullPointerExceptiion(空指针异常):当尝试访问一个为null的对象或者调用null对象上的方法时,会引发空指针异常。

  2. IndexOutOfBoundsException(数组越界异常):当尝试访问数组、集合等数据结构时使用了不存在的索引或者越过了合法范围时,会引发数组越界异常。

  3. IllegalArgumentException(非法参数异常):当传递给方法的参数不符合方法的预期要求时,会引发非法参数异常。

  4. ClassCastException(类型转换异常):当试图将一个对象强制转换为不兼容的类型时,会引发类型转换异常。

  5. FileNotFoundException(文件不存在异常):当试图访问一个不存在的文件时,会引发文件不存在异常。

  6. ArithmeticException(算术异常):当出现数学运算异常,例如除数为零时,会引发算术异常。

  7. OutOfMemoryError(内存溢出错误):当程序试图申请的内存超过了可用的JVM堆内存空间时,会引发内存溢出错误。

  8. NoSuchElementException(没有此元素异常):当试图从一个空的集合中获取元素时,会引发没有此元素异常。

包装类的常用方法有哪些?

包装类(Wrapper Class)是指将基本数据类型包装成对象的类,如Integer、Double、Boolean等。包装类提供了丰富的方法来操作包装的基本数据类型。常用的包装类方法包括:

  1. valueOf():将基本数据类型转换为包装类对象。 例如:Integer i = Integer.valueOf(5);

  2. intValue()、doubleValue()、longValue():将包装类对象转换为对应的基本数据类型。 例如:int value = i.intValue();

  3. parseXxx():将字符串解析为对应的基本数据类型。 例如:int num = Integer.parseInt("123");

  4. toString():将包装类对象转换为字符串。 例如:String str = i.toString();

  5. equals():用于比较两个包装类对象是否相等。 例如:boolean result = Integer.valueOf(5).equals(Integer.valueOf(5));

  6. compareTo():用于比较两个包装类对象的大小。 例如:int result = Integer.valueOf(5).compareTo(Integer.valueOf(3));

  7. isInfinite()、isNaN():用于检查包装类对象是否表示无穷大或不是一个数字。 例如:boolean infinite = Double.valueOf(Double.POSITIVE_INFINITY).isInfinite();

  8. value():返回包装类对象对应的基本数据类型。 例如:int value = i.intValue();

Java中的异常处理关键字是什么?

Java中的异常处理关键字是try、catch和finally。使用try块来包含可能产生异常的代码,然后使用catch块来捕获并处理异常,最后使用finally块来执行无论是否发生异常都必须执行的代码。

Java中throw和throws关键字有什么区别?

在Java中,throw关键字用于主动抛出一个异常,可以用于在代码中手动创建和抛出异常对象。它通常在方法内部使用,也可以在catch块中重新抛出异常。

throws关键字用于在方法声明中指定可能抛出的异常类型。它表示方法可能会抛出异常,并且需要调用该方法的代码处理或继续抛出这些异常。throws关键字后面跟随的是异常类型,可以是单个异常类型,也可以是多个异常类型,使用逗号隔开。

区别:

  • throw关键字用于手动抛出异常对象,而throws关键字用于指定方法可能抛出的异常类型。
  • throw关键字通常在方法内部使用,而throws关键字出现在方法声明中。
  • throw关键字是具体的,表示抛出一个具体的异常对象,而throws关键字只是指定了方法可能抛出的异常类型。
  • throw关键字可以在任意位置使用,而throws关键字只能出现在方法声明中。
  • 使用throw关键字抛出异常时,程序会立即停止执行;而使用throws关键字声明异常类型时,方法会将异常传递给调用者来处理。

集合和数组的区别?

  1. 长度和大小:数组的长度是固定的,一旦创建,无法改变。而集合的大小是可以动态变化的,可以根据需要增加或删除元素。

  2. 数据类型:数组可以存储任意类型的元素,包括基本数据类型和引用类型。而集合只能存储引用类型的元素,不能存储基本数据类型。

  3. 功能和操作:数组的功能相对简单,提供了基本的元素访问和遍历操作。而集合提供了更丰富的功能和操作,例如添加、删除、查找、排序、过滤等。

  4. 泛型支持:集合框架引入了泛型机制,可以指定集合存储的元素类型,从而提供了更好的类型安全性和编译时类型检查。而数组没有泛型机制,无法在编译时进行类型检查。

  5. 语法:数组使用的是方括号([])来声明和访问元素,例如:int[] arr = new int[5]; arr[0] = 1;。而集合使用的是尖括号(<>)来定义泛型类型,并通过方法来操作元素,例如:List list = new ArrayList<>(); list.add(1);

总的来说,数组适合存储固定大小的元素集合,而集合适合存储动态变化的元素集合,并且提供了更多的功能和灵活性。在使用时,可以根据具体的需求选择使用数组还是集合。

IO流的分类

IO流按照数据流的方向和单位可以分为输入流和输出流,按照数据的类型可以分为字节流和字符流。综合考虑这两个维度,可以得到四类基本的IO流:

  1. 字节输入流(InputStream):用于从数据源(如文件、网络等)读取字节数据的流。常见的字节输入流类有FileInputStream、ByteArrayInputStream和Socket.getInputStream()等。

  2. 字节输出流(OutputStream):用于向目标(如文件、网络)写入字节数据的流。常见的字节输出流类有FileOutputStream、ByteArrayOutputStream和Socket.getOutputStream()等。

  3. 字符输入流(Reader):用于从数据源读取字符数据的流。字符输入流可以将字节数据转换为字符数据,常见的字符输入流类有FileReader、InputStreamReader和StringReader等。

  4. 字符输出流(Writer):用于向目标写入字符数据的流。字符输出流可以将字符数据转换为字节数据,常见的字符输出流类有FileWriter、OutputStreamWriter和StringWriter等。