异常是什么?
在Java中,异常是一种在程序执行期间发生的不正常情况。当程序遇到异常时,它可能无法继续正常执行,并可能导致程序中断、崩溃或产生错误的结果。异常提供了一种机制,让程序员能够在出现问题时采取适当的措施,而不是简单地中断程序的执行。
异常的分类
Java中的异常可以分为三类:
-
检查异常(Checked Exception): 是在编译时由编译器强制检查的异常。这类异常通常表示程序运行环境外的错误,程序员必须在代码中显式地处理这些异常或者通过
throws
关键字声明方法会抛出这些异常。例如,IOException
是一个检查异常。 -
非检查异常(Unchecked Exception): 也称为运行时异常,是在运行时由Java虚拟机(JVM)检测到的异常。这类异常通常是由程序中的逻辑错误引起的,例如,
NullPointerException
或ArrayIndexOutOfBoundsException
。程序员可以选择捕获并处理这些异常,但不强制要求。 -
错误(Error): 表示严重的问题,通常是程序无法处理的情况。与异常不同,错误一般不应该被程序员捕获和处理,因为它们通常指示着系统级的问题,例如内存溢出(
OutOfMemoryError
)。
异常的层次结构
Java中的异常类都继承自Throwable
类,而Throwable
类有两个主要的子类:Error
和Exception
。
-
Error: 表示程序无法处理的严重问题,通常是系统级的错误。程序员不应该捕获
Error
类型的异常,因为这通常表示程序无法继续执行。 -
Exception: 表示程序运行过程中可能会遇到的一般性问题。
Exception
又分为两大类:- 检查异常(Checked Exception): 继承自
Exception
,除了RuntimeException
及其子类外的所有异常都属于检查异常。 - 非检查异常(Unchecked Exception): 继承自
RuntimeException
及其子类,通常是由程序中的逻辑错误引起的异常
- 检查异常(Checked Exception): 继承自
常见的运行时异常
NullPointerException 空指针异常
ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组下标越界异常
InputMismatchException 输入异常
ClassCastException 类转换异常
DateFormateException 日期转化异常
ClassNotFoundException 类找不到异常
IOException IO异常
SQLExcption 数据库异常
自定义异常
//自定义一个名字为DefinedException的异常
public class DefinedException extends Exception{
// 添加一个构造方法,可以传递异常信息
public DefinedException(String msg){
super(msg);
}
}
import java.util.Scanner;
public class DefinedExceptionTest {
public static void main(String[] args) throws DefinedException {
Scanner scanner = new Scanner(System.in);
//从键盘获取一个用户名
System.out.println("请输入用户名:");
String userName = scanner.next();
/*对获取的用户名进行判断,若不等于admin则用throw new一个异常
注意:一个throw语句只能抛出一个异常。throw语句后面只能跟随一个异常对象。
如果你想在同一个代码块中抛出多个异常,你需要使用多个throw语句或者将多个异常封装成一个容器异常一起抛出。*/
if (!userName.equals("admin")) {
throw new DefinedException("用户不存在");
}
}
}
/*throws 关键字后面可以列举多个异常类型,表示该方法可能抛出这些异常之一。
多个异常类型之间使用逗号进行分隔。*/
public static void main(String[] args) throws DefinedException,Exception {
// 方法体
}