一.异常和错误
1.错误(Errors):
- 错误是指程序在运行过程中遇到的无法处理的问题,通常是由底层系统或硬件出现的严重问题导致的,比如内存溢出等。
- 错误是致命的,会导致程序无法继续执行,通常情况下程序会直接终止。
- 由于错误通常是与底层系统或硬件相关的,因此程序本身很难对其进行处理。
2。异常(Exceptions):
- 异常是指程序在正常运行过程中遇到的意外情况,导致程序无法继续执行或者执行结果与预期不符合的问题。
- 异常是非致命的,不会导致程序直接终止,但如果不加以处理,可能会影响程序的正常执行流程。
- Java 提供了异常处理机制,允许程序在遇到异常时进行捕获和处理,以便程序能够以一种合适的方式继续执行或者进行异常情况的处理。
异常和错误的区别:异常能被程序本身处理,错误是无法处理
二.异常的种类
1.编译时异常
编译时异常是指在编译阶段可以被检测到的异常。在Exception 类中,除了RuntimeException 类以外,其他子类都是编译时异常。在编写代码时,如果存在可能抛出编译时异常的代码,必须在代码中使用try…catch…语句捕获或一直向上抛出来处理该异常。Java编译器会对编译时异常进行检查,如果出现这类异常就必须对其进行处理,否则程序无法通过编译。
2.运行时异常
(1)什么是运行时异常?
RuntimeException类及其子类异常都是运行时异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是由Java虚拟机在程序运行时自动进行捕获处理的。与编译时异常不同,编译器不要求程序员显式地处理这些异常,即使没有捕获或声明抛出这些异常的代码,程序仍然可以编译通过。但是,如果Java虚拟机遇到未捕获的运行时异常时,程序会终止执行。
运行时异常一般是由程序逻辑错误引起的,程序员应该在编写代码时尽可能地避免这些异常的发生。
3.自定义异常
(1)什么是自定义异常?
虽然Java中有很多异常类,但是在实际开发中所遇到的一些异常,不能完全表示,所以就需要自定义异常类.
自定义异常默认会继承Exception或者RunTimeException。继承自Exception的异常默认是编译时异常,继承自RunTimeException的异常默认是运行时异常。
使用自定义异常时,通常的做法是在方法中使用 throw 语句来抛出自定义异常,然后在调用该方法的地方使用 try-catch 语句块来捕获并处理异常
(2)如何定义自定义异常?
当定义自定义异常时,首先需要创建一个类,并继承自Java提供的异常类,如 Exception 或 RuntimeException ,然后添加自定义的构造方法和其他方法。
例如:
public class InvalidISBN extends Exception{
public InvalidISBN(String message) {
super(message);
}
}
三.处理异常
1.使用try-catch-finally语句捕获处理异常
-
try 代码块:包含可能抛出异常的代码。如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch代码块;如果异常没有发生,则顺序执行try的代码块,不会进入到catch代码块。
-
catch 代码块:用于捕获并处理 try 代码块中抛出的异常。可以有多个 catch 块,每个 catch 块处理一种类型的异常。
-
finally 代码块:无论是否发生异常,finally 代码块里面都会被执行的关键字。
内容补充:
1.在 try 内定义的变量,只能在 try 块内访问,而不能在 catch 或 finally 块中访问。
2.当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。
2.throw 和 throws 声明处理异常
-
throw关键字的作用: 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
-
throws关键字的作用:使用throws关键字将问题标识出来, 表示当前方法不处理异常,而是提醒给调用者, 让调用者来处理。( 调用者的处理方式:调用者可以使用throws继续向上抛出或者在方法内部使用try…catch…语句捕获处理异常。)
如果一直上抛,最终会到虚拟机,虚拟机会直接结束程序,打印异常信息。
注意:
1.throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,运行时异常和编译时异常都可以被抛出。
2.throws 关键字用在方法声明上,可以抛出多个异常。