异常
异常基本概念:将程序执行中发生的不正常情况称为“异常”,(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常事件可分为两类
Error
Java虚拟机无法解决的严重问题。如 JVM系统内部错误、资源耗尽等严重情况。
Exception
其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的问题进行处理。Exception分为两大类:运行时异常[程序运行时,发生的异常] 和 编译时异常[编程时,编译器检查出的异常]
异常体系图
异常处理
基本介绍:异常处理就是当异常发生时,对异常处理的方式
异常处理的方式
try-catch-finally
格式:
try{
代码/可能有异常
}catch(Exception e){
- 当异常发生时
- 系统将异常封装成Exception对象e,传递给catch
- 得到异常对象后,程序员自行处理
- 如果没有发生异常,catch代码块不执行
}finally{
- 不管try代码块是否有异常发生,始终需要执行finally
- 通常将释放资源的代码放在finally
}
示例代码:
public class ExceptionDemo{
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
try {
int res = num1/num2; //分母不能为0,异常
//使用快捷键ctrl+alt+t 选择try/catch
} catch (Exception e) {
// e.printStackTrace();
// System.out.println("有异常信息");
System.out.println(e.getMessage()); //输出异常信息
}finally {
System.out.println("释放资源");
}
System.out.println("程序已到达最底部");
}
}
在代码中捕获发生的异常,自行处理
throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者是JVM
如果程序员没有显式的处理异常,默认就是throws
throws:
- throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
- throws关键字后也可以是异常列表,即可以抛出多个异常
- 对于编译异常,程序中必须处理,比如try-catch或者throws
- 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
- 子类重写父类方法时,对抛出的异常规定:子类重写的方法,所抛出的异常类型要么与父类抛出的异常类型一致,要么为父类抛出的异常类型的子类型
- 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必使用throws
使用方式:
public void run() throws Exception {
//创建了一个文件流对象
FileInputStream fis = new FileInputStream("d://aa.txt");
//FileNotFoundException 编译异常
}
throw
在Java中,throw关键字用于手动抛出异常。通过 throw可以在程序执行过程中显式地抛出特定类型的异常。例如:
public class Example {
public static void main(String[] args) {
try {
//可能引发异常的某些代码
throw new IllegalArgumentException("这是一条自定义异常消息。");
} catch (IllegalArgumentException e) {
System.out.println("捕获的异常: " + e.getMessage());
}
}
}
在上面的例子中,throw语句用于抛出一个 IllegalArgumentException,并在 catch块中捕获并处理该异常。这允许程序员在需要时明确地引发异常,以便进行适当的错误处理
自定义异常
在Java中,创建自定义异常类可以满足特定程序或应用的需求。自定义异常类通常扩展自Exception类或其子类。以下是创建和使用自定义异常类的基本步骤:
//1.自定义一个异常类
class TestException extends RuntimeException{
public TestException(String message) {
super(message);
}
}
public class Demo {
public static void main(String[] args) {
//要求年龄范围在18-60岁之间,否则抛出一个自定义异常
int age = 900;
if (!(age>=18 && age <=60)){
//2.在代码中使用自定义类
throw new TestException("年龄输入不正确,要求在18-60之间");
}
System.out.println("你的年龄输入正确");
}
}
自定义异常类的主要优势在于它允许你定义特定于你的应用程序逻辑的异常,并提供更具意义的异常信息。
throw和throws的区别
常见的异常
在Java中,异常是指程序运行时可能出现的问题或错误。以下是几种常见的异常及其简要说明:
NullPointerException (空指针异常):
产生原因:当试图访问对象的属性或调用对象的方法时,但该对象为null时,就会发生空指针异常。
示例:
Object obj = null;
obj.toString();
ArrayIndexOutOfBoundsException (数组越界异常):
产生原因:当试图访问数组的不存在的索引位置时,就会导致数组越界异常。
示例:
int[] arr = {1, 2, 3};
int value = arr[5];
ArithmeticException (算术异常):
产生原因:在进行数学运算时,如果出现除以零的情况,就会抛出算术异常。
示例:
int result = 5 / 0;
IllegalArgumentException (非法参数异常):
产生原因:当传递给方法的参数值不合法时,会引发非法参数异常。
示例:
void setAge(int age) {
if (age < 0)
throw new IllegalArgumentException("年龄不能为负数");
}
ClassNotFoundException (类未找到异常):
产生原因:当试图加载不存在的类时,会抛出类未找到异常。
示例:
Class.forName("com.example.NonExistentClass");
IOException (输入/输出异常):
产生原因:在进行文件操作、网络通信等输入输出操作时,可能会发生输入输出异常。
示例:
FileInputStream fis = new FileInputStream("nonexistentfile.txt");
FileNotFoundException (文件未找到异常):
产生原因:当试图访问不存在的文件时,会引发文件未找到异常。
示例:
FileInputStream fis = new FileInputStream("nonexistentfile.txt");
RuntimeException (运行时异常):
运行时异常是Unchecked异常的一种通用表示,包括诸如ClassCastException、NumberFormatException等。
产生原因:通常是由程序逻辑错误引起的,编译器不会强制要求处理这类异常。
示例:
String str = "abc";
int num = Integer.parseInt(str);
以上是一些Java中常见的异常类型,了解这些异常有助于编写更健壮、可靠的Java程序。在实际开发中,通过合理的异常处理可以提高程序的稳定性和可维护性。