什么是异常,java出现异常的场景
-
错误
- 程序运行时发生的不被期望的事件,阻止了程序按照预期正常执行
- 常见程序错误分三类
- 编译错误:新手最常见,没遵循语法规范
- 运行时错误:程序在执行时,
- 逻辑错误:程序没有按照预期的逻辑顺序执行
- Java异常分为两类:
- 检查型异常(Checked Exception) :编译器强制要求程序员进行捕获处理的异常,如
IOException、SQLException等。 - 非检查型异常(Unchecked Exception) :编译器不要求强制捕获的异常,如
RuntimeException及其子类。
- 检查型异常(Checked Exception) :编译器强制要求程序员进行捕获处理的异常,如
-
异常处理机制
-
Java提供了五个关键字来处理异常:
try、catch、finally、throw和throws。- try:包含可能出现异常的代码块。
- catch:用于捕获try块中抛出的异常,并处理它。
- finally:无论try块中的代码是否抛出异常,finally块中的代码都会被执行。它常用于关闭资源或进行清理工作。
- throw :用于显式地抛出一个异常,需要是
new 异常类 - throws :用于声明 一个方法可能会抛出的异常,但不处理它,即往外抛

-
基本异常处理代码 public static void test1() { try { int result = 1 / 0; } catch (ArithmeticException e) { System.err.println("捕获到除数为0的异常:" + e.getMessage()); } finally { System.out.println("finally"); } }
-
抛出异常
- throws子句放在方法参数列表的右括号之后,一个方法可以声明抛出多个异常,多个异常之间用逗号隔开
csharppublic static void divide(int dividend, int divisor) throws ArithmeticException { if (divisor == 0) { throw new ArithmeticException("除数不能为0"); } System.out.println(dividend / divisor); }
-
-
总结:当抛出一个被检查的异常,我们必须使用try-catch块来处理它,或者在方法声明中使用throws子句继续往外抛
Java内置异常体系分类和核心方法
简介:Java内置异常体系分类和核心方法讲解
-
Throwable类
- Java.lang软件包中有一个java.lang.Throwable类,这个类是java中所有错误和异常的超类
- Throwable类有两个子类,Error与 Exception
- Error 错误:
- 代表系统级别的错误,通常是JVM(Java虚拟机)相关的错误,如
OutOfMemoryError(内存溢出错误)等。 - 这些错误通常是不可恢复的,并且大多数应用程序不应该试图去捕获或处理它们。
- 代表系统级别的错误,通常是JVM(Java虚拟机)相关的错误,如
- Exception 异常:
- 代表程序可能出现的问题,在编程时需要重点关注的。
Exception类又可以分为运行时异常(RuntimeException)和非运行时异常(即编译时异常或已检查异常)。
- Error 错误:
-
Throwable类(定义了一些用于处理错误和异常的核心方法)
- public String getMessage()
- 异常的详细信息 try { throw new Exception("This is a test exception"); } catch (Exception e) { System.out.println(e.getMessage()); }
- public Throwable getCause()
- 异常原因 Exception cause = new Exception("The cause of the problem"); Exception exception = new Exception("A problem occurred", cause); try { throw exception; } catch (Exception e) { System.out.println(e.getCause().getMessage()); }
- public void printStackTrace()
- 打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置 try { throw new Exception("This is a test exception"); } catch (Exception e) { e.printStackTrace(); // 打印错误的堆栈信息 }
- public String getMessage()
-
运行时异常,不可查异常(RuntimeException子类)
- 是那些可能在Java虚拟机正常运行期间抛出的异常,但是编译器不会检查这类异常是否被处理
- 如果编写了一个可能会抛出运行时异常的方法,不需要在方法签名中使用
throws关键字来声明这个方法会抛出这些异常 - 常见的运行时异常包括:
NullPointerException:当应用程序试图在需要对象的地方使用null时抛出。ClassCastException强制失败抛出异常ArrayIndexOutOfBoundsException:当应用程序试图访问数组的非法索引时抛出。ArithmeticException:当出现异常的算术运算条件时抛出,例如除以零。
-
非运行时异常,可查异常(编译时异常或已检查异常,必须要在方法里面捕获或者抛出)
- 是那些编译器会检查是否已经被处理的异常。
- 如果编写了一个可能会抛出非运行时异常的方法,必须在方法签名中使用
throws关键字来声明这个方法会抛出这些异常。 - 调用这个方法的代码也必须处理这些异常,或者使用
throws关键字再次声明这些方法也可能会抛出这些异常。 - 常见的非运行时异常包括:
ClassNoFoundException应用程序试图加载类,找不到对应的类IllegalAccessException拒绝访问一个类的时候NoSuchFieldExcetion请求的变量不存在NoSuchMethodException方法不存在IOException:当发生输入/输出错误时抛出。SQLException:当使用JDBC(Java Database Connectivity)与数据库交互时,发生SQL错误或数据库访问错误时抛出。
java异常处理之多重捕获处理
-
异常处理之多重捕获
-
多重捕获(Multiple Catch)是Java异常处理中的一个重要概念,它允许在单个try块后面跟随多个catch块,
-
捕获不同类型的异常,这种机制使得代码更加清晰和易于管理,特别是在处理多种可能的异常时。
-
语法
- 结构 :一个
try代码块后面可以跟随多个catch代码块,每个catch代码块用于捕获并处理不同类型的异常。 - 顺序 :
catch代码块的顺序很重要。Java会按照catch代码块的顺序进行匹配,将更具体的异常类型放在前面 - finally块
- 在
try/catch后面添加finally块是可选的,无论是否发生异常,finally代码块的代码总会被执行。 finally块通常用于执行清理操作,如关闭文件或数据库连接。
- 在
- 结构 :一个
-
例: public class MultipleCatchExample { public static void main(String\[\] args) { try { divide(1, 0); } catch (ArithmeticException e) { System.out.println("算数异常:" + e.getMessage()); } catch (NullPointerException e) { System.out.println("空指针异常" + e.getMessage()); } catch (Exception e) { System.out.println("其他类型的异常" + e.getMessage()); } finally { System.out.println("finally"); } }
csharp// 抛出异常 public static void divide(int dividend, int divisor) { if (divisor == 0) { throw new ArithmeticException("除数不能为0"); } System.out.println(dividend / divisor); } }
-
java异常处理之自定义异常
-
什么是自定义异常
- 当前JDK内置的异常不满足需求,项目会出现特有异常
- 自定义异常可以让业务更清晰
-
如何进行自定义异常
- 异常都是继承自Exception类,所以我们要自定义的异常也需要继承这个基类。
- 定义一个新的异常类 :继承自
Exception或RuntimeException。 - 提供构造函数:提供一个或多个构造函数,这些构造函数可以接受一个描述异常详情的字符串,并传递给父类的构造函数。
- (可选)添加其他方法:根据需要,还可以在自定义异常类中添加其他方法或字段。
-
例:
-
定义异常类 public class InvalidDataException extends RuntimeException { public InvalidDataException() { super(); }
scsspublic InvalidDataException(String message) { super(message); } public InvalidDataException(String message, Throwable cause) { super(message, cause); } } -
当检测到无效数据时,创建一个新的
InvalidDataException实例并抛出它 public class DataProcessor { public void processData(String data) throws InvalidDataException{ if (data == null) { throw new InvalidDataException("Invalid data:" + data); } System.out.println(data); } } -
调用
processData方法的代码中使用try-catch块来处理 public class CustomExceptionDemo { public static void main(String\[\] args) { DataProcessor dataProcessor = new DataProcessor(); try { dataProcessor.processData(null); } catch (InvalidDataException e) { e.printStackTrace(); } } }
-