文章目录
一、 异常
什么是异常?异常机制在Java中有什么用?
什么是异常:Java程序在执行过程中的意外,错误,出现的不正常的情况。异常机制在可以提高程序的健壮性。
在Java语言中,异常是以对象的形式存在的,所有的异常是在运行的时候发生的。
(一) 异常的继承结构
编译时异常包括所有Exception的子类(除RuntimeException之外)
所有的运行时异常在程序员编写程序阶段,可以选择处理,也可以选择不处理。所有的编译时异常要求程序员在编写程序阶段必须对其进行预处理,如果没有预先处理,则编译器会报错。语法错误也属于编译时异常。
编译时异常(Checked Exception):
编译时异常是在编译阶段检测到的异常,需要在代码中显式处理或声明抛出。这些异常通常表示程序可能遇到的外部情况,例如文件不存在、网络连接中断等。
编译时异常是从Exception类派生的子类,但不是RuntimeException的子类。如果方法可能会抛出编译时异常,该方法的声明中需要使用throws关键字声明可能抛出的异常,或者在方法内部使用try-catch块来处理异常。如果在方法中抛出编译时异常但未进行处理或声明抛出,编译器将会报错。
运行时异常(Unchecked Exception):
运行时异常是在运行程序过程中才会被检测到的异常。
这些异常通常表示程序内部错误、逻辑错误、不合法的参数或操作等。运行时异常是从RuntimeException类及其子类派生的异常。运行时异常不需要显式处理或声明抛出。如果未在代码中处理运行时异常,它们将会在运行时抛出并终止程序的执行。常见的运行时异常包括NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException等。
(二) 自定义异常
- 编写一个异常类继承Exception或者RuntimeException,继承Exception类的异常类,必须处理,处理方法包括throws声明异常和捕捉异常,继承RuntimeException可以处理可以不处理。
- 声明一个无参构造方法和有参构造方法(参数是String类型的),并且在构造方法中调用super(String)。
public class IlleagleNameException extends Exception {
public IlleagleNameException(){
}
public IlleagleNameException(String msg){
super(msg);
}
}
(三) 异常的处理方法
1、throws
谁调用,谁处理,将异常一层一层向上抛出(在方法签名用throws声明异常,可声明实际异常的父类,不可声明子类,抛大不抛小),一旦抛出异常,该语句后面的程序不会执行。
package com.rongrong.javase;
import java.util.Scanner;
public class ExceptionTest02 {
public static void main(String[] args) throws IlleagleNameException,IllegaleAgeexception{
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎使用本系统,先进行用户的注册:");
System.out.println("请输入用户名:");
String name = scanner.next();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
//注册
new UserService().register(name,age);
}
}
class UserDao{
public void save (String name, int age) throws IlleagleNameException,IllegaleAgeexception{
System.out.println();
if (name.length() < 6 || name.length() >12){
throw new IlleagleNameException();
}
if (age < 18){
throw new IllegaleAgeexception();
}
}
}
class UserService{
public void register(String name,int age) throws IlleagleNameException,IllegaleAgeexception{
System.out.println("正在注册,请稍候.....");
UserDao userDao = new UserDao();
userDao.save(name,age);
System.out.println("注册成功,欢迎["+name+"]");
}
}
2、try-catch
语法格式:
try{
//需要尝试执行的程序,这里的程序可能会出现异常
...
..如果执行到这出现了异常,则try后续的代码不再执行。
...
}catch(异常类型1 变量名){
//当捕捉到的异常是“异常类型1”时,走这个分支,进行异常的处理
}catch(异常类型2 变量名){
//当捕捉到的异常是“异常类型2”时,走这个分支,进行异常的处理
}catch(异常类型3 变量名){
//当捕捉到的异常是“异常类型3”时,走这个分支,进行异常的处理
}...
// 后续Java代码可以正常执行
catch语句块可以看做分支,最多只有一个catch分支执行。多个catch必须遵循自上而下,从小到大的顺序书写。
是声明异常和还是捕捉异常取决于这个异常需不需要让别人知道。手动抛出的用声明处理,而一般在前端页面的时候捕捉,打印一些提示消息。
(四) 异常的使用
参考(一)中的代码,在最终调用处采用try-catch捕捉异常。
(五) 异常对象的常用方法
1、getMessage()
获取异常的简单描述信息,在catch块中可以将创建异常对象的提示信息打印出来。
public class IlleagleAgeException extends Exception {
public IlleagleNameException(){
}
public IlleagleNameException(String msg){
super(msg);
}
}
throw new IlleagleAgeException("balabala");
try{
}catch(IlleagleAgeException e){
String msg = e.getMessage(); //msg = balabala
}
2、printStackTrace()
打印异常跟踪的信息,异常信息的打印是符合栈数据结构的,看异常信息主要是最开始的描述信息。
(六)finally语句块
- finally语句块不能单独使用,至少需要配合try语句块一起使用
- try…finally…
- try…catch…finally…
- finally语句块中的代码一定会执行的,如果在try中退出了JVM,则finally语句块中语句不会执行。通常在finally语句块中完成资源的释放。
try{
System.out.println("try...");
System.exit(0) //退出JVM
}finally{
// 这里的代码无法执行
System.out.println("finally...");
}
(七)方法覆盖与异常
子类继承父类后,重写了父类的方法,重写之后不能抛出更多的异常可以更少。