异常是Java编程中的常见问题,了解如何处理异常至关重要。本文将介绍Java中异常的基本概念,以及如何捕获和处理它们,以构建健壮的应用程序。
异常
异常是在程序运行过程中发生的错误或意外情况,它可以中断正常的程序流程并引发错误处理机制。
Code:
// 尝试执行可能引发异常的代码
public void divide{
int num1=10;
int nums2=0;
int result = num1 / num2; // 10/0 直接抛出异常
}
但是在真实的业务中,如果因为一个异常导致整个程序无法继续进行,说明这个程序的健壮性很差,
为了保证程序能够进行,可以使用trye-catch异常处理机制来解决
Code:
public void divide{
try {
int num1=10;
int nums2=0;
int result = num1 / num2; // 10/0 直接抛出异常
} catch (ArithmeticException e) {
// 捕捉并处理异常
System.err.println("发生了算术异常:" + e.getMessage());
}
// 无论是否发生异常,都会执行的代码块
System.out.println("程序执行结束");
}
如果进程异常处理,那么即使程序出现了异常,程序也可以继续进行。
概念
将程序执行中发生不正常的情况成为“异常”(开发过程中出现的语法错误等不是异常)
在执行过程中所发生的异常可以分为两大类:
Error
Jvm无法解决的严重问题,如:
Exception
Exception可以分为
体系图
常见运行时异常
NullPointerException
空指针异常,通常在尝试访问或操作尚未初始化或已设置为**null
**的对象时发生。
Code:
String myString = null;
System.out.println(myString.length()); // 这将引发NullPointerException
ArithmeticException
算数异常,它在进行算术运算(例如除以零)产生无效结果时发生。
Code:
int result = 5 / 0; // 这将引发ArithmeticException(算术异常)
这段代码中,尝试5除以0,从数学上来说是未定义计算公式,因此会引发ArithmeticException异常。
ArrayIndexOutOfBoundException
数组索引越界异常,通常在访问数组中不存在的索引位置而抛出。
Code:
int nums={1,2,3,4};
int value=nums[10];
数组nums有5个元素,索引范围是0~4,但是我们试图访问索引10的元素,这个索引超出了数组的最大范围,
因此抛出ArrayIndexOutOfBoundException异常。
ClassCastException
类型转换异常,通常在一种类型转为不兼容的类型时抛出。
Code:
class Animal {
// ...
}
class Dog extends Animal {
// ...
}
class Cat extends Animal {
// ...
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
Cat cat = (Cat) animal; // 这将引发ClassCastException(类转换异常)
}
}
创建了Animal类和两个子类Dog、Cat,我们试图将Dog对象的引用转为Car类型,这是一种不兼容的类型,
因此抛出ClassCastException异常。
NumberFormatException
数字格式异常,通常在字符串转为数字类型时发生格式错误时抛出
Code:
String invalidNumber = "abc123";
int number = Integer.parseInt(invalidNumber); // 这将引发NumberFormatException(数字格式异常)
我们试图将包含字母字符的字符串"abc123" 转换为整数,这是不合法的数字格式,
因此会引发NumberFormatException(数字格式异常)。
常见的编译异常
SQLException
:(SQL异常)它表示在执行SQL语句或与数据库交互的过程中发生了问题或错误。IOException
:(输入/输出异常)它表示在读取或写入文件、网络操作或其他I/O相关操作期间发生了问题或错误。FileNotFoundException
:(文件未找到异常)FileNotFoundException
是IOException
的一种子类,表示尝试打开或读取一个不存在的文件时引发的异常。ClassNotFoundException
:(类未找到异常)表示在尝试加载类时找不到类定义的情况异常处理机制
在Java中,异常处理是通过一系列的关键字和机制来实现的。
try-catch块:使用 try 和 catch 关键字来捕获和处理异常。异常可能会在 try 块中的代码中抛出,而 catch 块则用于捕获异常并执行相应的处理代码。
try {
// 可能会引发异常的代码
} catch (ExceptionType e) {
// 处理异常的代码
}
多重catch两块:一个try块可以有多个catch块,用于捕获不同类型的异常,这样可以根据不同的类型异常执行不同的逻辑。
try {
// 可能会引发异常的代码
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 类型的异常
}
finally块:finally块用于包含try-catch块之后,它包含的代码无论是否发生异常都会执行。
try {
// 可能会引发异常的代码
} catch (ExceptionType e) {
// 处理异常的代码
} finally {
// 无论是否发生异常都会执行的代码
}
throws关键字:throw关键字可以用于在方法中主动引发异常,并不能像try-catch块一样有处理异常的逻辑,通常用于自定义异常或在特定条件下引发异常。
public void someMethod() throws ExceptionType {
// 可能会引发异常的代码
}
自定义异常
当程序中出现了某些“错误”,但该类错误信息并没有在Throwable子类中描述处理,这个时候可以自定义异常类,用于描述该错误信息
自定义异常步骤:
自定义异常类;如果继承Exception,属于编译类型异常;如果继承RuntimeException,属于运行时异常(通过继承RuntimeException)
public class MyCustomException extends Exception {
public MyCustomException() {
super();
}
public MyCustomException(String message) {
super(message);
}
public MyCustomException(String message, Throwable cause) {
super(message, cause);
}
}
通过自定义异常类提供多个构造函数,以便能够传递异常消息和可能的原因(Throwable
)。这样可以让您的异常提供更多信息,以便于调试和理解问题。
使用自定义类异常,在代码中如果符合自定义异常的条件时,使用throw关键字抛出自定义异常;
public void someMethod() throws MyCustomException {
// 某些条件导致自定义异常情况
if (someCondition) {
throw new MyCustomException("自定义异常消息");
}
// 其他代码
}
捕获和处理自定义异常:在应用程序的其他部分,也可以使用 try-catch 块来捕获和处理自定义异常
try {
someMethod();
} catch (MyCustomException e) {
// 处理自定义异常
System.out.println("捕获自定义异常:" + e.getMessage());
}
throw和throws对比
意义 | 位置 | 后面根的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
throw:在代码中显示地抛出异常对象,用于指定条件下的异常,throw 后面通常跟着一个异常对象的实例化或引用;
public void someMethod() {
if (someCondition) {
throw new SomeException("Custom error message");
}
}
throws:用于在方法声明中指定该方法可能会抛出的异常类型。
public void someMethod() throws ExceptionType {
// 可能会引发异常的代码
}
通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java异常的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。