Java异常

一、 异常

什么是异常?异常机制在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{

}catchIlleagleAgeException 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...");
}

(七)方法覆盖与异常

子类继承父类后,重写了父类的方法,重写之后不能抛出更多的异常可以更少。

  • 42
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值