目录
1.0 什么是异常?
1.1 异常主要分为两个情况分别是运行时异常、编译时异常。
2.0 怎么处理异常呢?
2.1 捕获异常(Catch Exception)
2.2 声明异常(Declare Exception)
3.0 自定义异常
3.1 如何定义异常类?
3.2 自定义运行异常
3.3 自定义编译异常
3.4 区别 throw 与 throws
4.0 用例子进一步了解异常的魅力:
1.0 什么是异常?
异常是在程序执行过程中出现的意外或不正常的情况。当程序遇到无法处理的错误、意外输入或其他不符合预期的情况时,会引发异常。这可能包括但不限于:除以零、访问不存在的变量、文件读取错误等。异常会打断程序的正常执行流程,并通过抛出异常的方式通知程序员或系统。简单来说就是,就是代表程序出现了问题。
1.1 异常主要分为两个情况分别是运行时异常、编译时异常。
运行时异常:指继承自 RuntimeException 的异常类。它们是在程序运行期间可能抛出的异常,通常表示程序中的逻辑错误或错误的使用方式,运行时异常不需要在方法签名中声明或捕获。这意味着你可以选择捕获或不捕获运行时异常,而不会导致编译错误。
常见的运行时异常包括:
- NullPointerException(空指针异常):当尝试访问一个空对象的成员时抛出。
- IllegalArgumentException(非法参数异常):当传递给方法的参数不合法或无效时抛出。
- IllegalStateException(非法状态异常):当对象的状态不符合方法调用的前提条件时抛出。
- IndexOutOfBoundsException(索引越界异常):当尝试访问数组或集合中不存在的索引时抛出。
- ArithmeticException(算术异常):当出现除以零或其他算术错误时抛出。
运行异常指的是在编译的时候不会去"干扰"程序员,只有在运行的时候出现了类似以上的情况就会报异常。
举例来说明一下运行异常:
可以看出来在 IDEA 这个编译器中在编译代码的过程中,并没有很强烈的提示哪里出现了异常。
运行结果如下:
明确表示了是运行异常。
编译异常:指在编译阶段可能发生的异常,需要在代码中显式地处理或声明。它们是指继承自 Exception(但不是 RuntimeException )的异常类。与运行时异常不同,编译时异常必须在方法签名中声明,或者在方法内部进行捕获和处理,否则会导致编译错误。
常见的编译时异常包括:
- IOException(输入输出异常):当发生输入或输出错误时抛出,如文件读取错误、网络连接错误等。
- SQLException(SQL异常):当执行SQL操作时发生错误时抛出,如数据库连接错误、SQL语法错误等。
- ClassNotFoundException(类未找到异常):当尝试加载不存在的类时抛出。
- InterruptedException(中断异常):当线程在等待、休眠或阻塞状态时被中断时抛出。
- FileNotFoundException(文件未找到异常):当尝试访问不存在的文件时抛出。
编译异常指的是在编写代码的时候就出现了异常,要求程序员必须要对这个代码进行处理,这个异常才会被解决。
举例来说明一下编译异常:
关注两个点,第一点就是在编写代码的时候 IDEA 编译器就出现了很强烈的提醒,表明了波浪线,是为了提醒程序员这个点很容易出错。第二点,如果对编译异常不采取任何的声明或者捕获的方式时,就会程序会直接报错了,程序运行不了了。
具体的处理异常的方式以下内容会讲到。
2.0 怎么处理异常呢?
处理异常的方式可以分为两种:捕获异常和声明异常。
2.1 捕获异常(Catch Exception)
捕获异常(Catch Exception):使用 try-catch 语句块来捕获异常并处理异常情况。try 块中包含可能抛出异常的代码,catch 块用于捕获并处理异常。捕获异常可以防止程序因异常而终止,并提供了对异常情况的处理机制。
import java.text.ParseException; import java.util.Date; import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) {Date date = null;try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";date = simpleDateFormat.parse(str);} catch (ParseException e) {throw new RuntimeException(e);}System.out.println(date);} }
对编译异常采取了捕获异常的方式进行处理。补充一下,在大部分情况中,普通的运行异常没有必要采取捕获异常或者是声明异常处理。但是对于自定义的运行异常很有必要采取相应发措施对异常处理。
2.2 声明异常(Declare Exception)
声明异常(Declare Exception)是在方法签名中声明可能抛出的异常类型。通过在方法声明中使用 throws 关键字列出可能抛出的异常,将异常的责任转移到调用方。调用方必须处理或继续声明这些异常,否则会导致编译错误。
import java.text.ParseException; import java.util.Date; import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";Date date = simpleDateFormat.parse(str);System.out.println(date);} }
对编译异常采取了声明异常的方式进行处理。用了 throws 关键字。
3.0 自定义异常
自定义异常是指根据特定的需求和场景,自行定义的异常类。通过自定义异常,可以提供更具体和可读性的异常信息,以便于开发人员在程序出现错误时能够更好地理解和调试问题。简单的来说就是 Java 无法为世界上的所有问题都提供异常类来代表,如果企业自己的某种问题,相通过异常来表示,那就需要自己来定义异常类了。
3.1 如何定义异常类?
因为有两种类型的异常,所以方式会稍微不同,但是情况大部分都是一样的。
3.2 自定义运行异常
先定义一个类继承 RuntimeException ,然后重写有参数的构造器,最后通过 new 自定义的类并且在构造器中传入需要报错的信息,再通过关键字 throw 抛出这个对象。
代码如下:
public class AgeAbnormalities extends RuntimeException{public AgeAbnormalities(String message) {super(message);} }
public class RunException {public static void main(String[] args) {fun(300);}public static void fun(int age){if (age>0 && age < 200){System.out.println(age);}else {System.out.println("输入不合法");throw new AgeAbnormalities("The age you entered is not legal");}} }
运行结果如下:
3.3 自定义编译异常
先定义一个异常类继承 Exception ,任何重写有参数的构造器,通过 throw new 异常类() 来创建异常对象并抛出。
代码如下:
public class AgeCompilationException extends Exception{public AgeCompilationException(String message) {super(message);} }
public class CompilationException {public static void main(String[] args) throws Exception{fun(300);}public static void fun(int age) throws Exception{if (age > 0 && age < 200){System.out.println(age);}else {throw new AgeCompilationException("The age you entered is not legal");}} }
需要注意的是:对于自定义编译异常,在编写完 throw new AgeCompilationException("The age you entered is not legal"); 这条语句之后,需要通过 throws 关键字声明异常,接着调用这个函数也需要用到声明异常或者捕获异常对编译异常处理。
运行结果如下:
3.4 区别 throw 与 throws
throw 和 throws 是 Java 中用于处理异常的关键字。
throw 关键字用于抛出一个异常对象。它通常用于方法内部,用于在特定的条件下主动抛出异常。使用 throw 关键字时,需要提供一个异常对象作为参数,该异常对象可以是 Java 内置的异常类,也可以是自定义的异常类。
throws 关键字用于在方法声明中指定可能抛出的异常类型。它用于告诉调用者,该方法可能会抛出某些异常,调用者需要进行相应的异常处理。使用 throws 关键字时,需要在方法声明后面跟上异常类型,可以是一个或多个异常类型,多个异常类型之间使用逗号分隔。
4.0 用例子进一步了解异常的魅力:
import java.util.Scanner; public class Text_Exception {public static void main(String[] args) {while (true) {try {getMoney();break;} catch (Exception e) {System.out.println("请输入数字!!!");}}}public static void getMoney(){Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入价格:");double money = scanner.nextDouble();if (money > 0){System.out.println(money);break;}else {System.out.println("输入不合法,请重新输入!!!");}}} }
运行结果如下:
具体作用就算非法输入不是数字时,程序都不会崩,而是尝试重新修复。所以这个程序非常健壮!自己去感受感受遇到这种情况的时候,是否可以用异常来解决。
这里有更多内容:小扳_-CSDN博客