Java异常机制

本文深入讲解Java异常处理机制,包括异常分类、throw与throws的区别、自定义异常等内容,并通过实例演示如何有效处理运行时异常与非运行时异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 异常的分类

2 throw 和throws的区别

3 自定义异常

4 异常的转化(比如非运行时异常转化为运行时异常)

  try{

 }catch(SQLException e){

  throw new RuntimeException(e)//非运行时异常转化为运行时异常

}

 

异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。

Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。Java异常体系结构呈树状,其层次结构图如图所示:

 

一 异常的分类

1、Thorwable类

Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

 
2.Error(错误):

一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。

3.Exception:

Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件

(1)SQLException:该异常提供关于数据库访问错误或其他错误的信息。

(2)RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类

(3)IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。

 
4、运行时异常和非运行时异常

(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

(2)非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

2 Throw Throws 的区别

1.     throw用在函数内

throws 用在函数上

2.     throw抛出的是异常对象

throws用于对异常类的声明,后面的异常类可以有多个,用逗号隔开

3 自定义异常

想要很好的运用异常光靠系统自带的异常体系是不够的,这时候我们就需要自定义异常,自定义异常是一定要继承异常体系的(Exception编译异常runtimeException运行时异常),只有这样才能被throw和throws关键字操作。一起来看案例里吧。

package Exception;

import jdk.jshell.spi.ExecutionControl;

/*编译异常——异常的类型转换

描述李老师使用电脑上课

安全隐患为:电脑会蓝屏,电脑冒烟

*/

//异常类

class BlueException extends Exception {//蓝屏异常

BlueException(){

super();

}

BlueException(String s){

super(s);

}

}

class MaoYanException extends Exception {

MaoYanException(){

super();

}

MaoYanException(String s){

super(s);

}

}

class NoPlanException extends Exception {

NoPlanException() {

super();

}

NoPlanException(String s) {

super(s);

}

}

//电脑

class Computer {

private int state = 2;//电脑的状态

void Run() throws BlueException, MaoYanException {

if (state == 0) {

throw new BlueException("电脑蓝屏了!!");

}

if (state == 2) {

throw new MaoYanException("电脑冒烟了!!!");

}

System.out.println("电脑运行!!!");

}

void ComputerReset() {

state = 1;

System.out.println("电脑重启了!!");

}

}

//老师

class Teacher {

private String name;

private Computer notebook;

Teacher(String name) {

this.name = name;

notebook = new Computer();

}

public String toString(){

return name+"老师上课";

}

public void Prelect() throws NoPlanException {

try {//只负责检测

notebook.Run();//使用电脑上课

//传递一个异常对象给catch

} catch (BlueException B) {

//要写出蓝屏后具体的解决方法————重启

System.out.println(B.toString());//toString:返回异常信息/名字+内容

B.printStackTrace();//将此throwable和其追溯打印到指定的打印流

notebook.ComputerReset();//重启

} catch (MaoYanException B) {

/*

对于电脑冒烟这个事,老师是无法给出解决方法的所以不能在老师的类里面声明冒烟异常,但是老师可以对冒烟造成的后果进行处理

*/

System.out.println(B.toString());

Test();

//但是电脑冒烟这个问题本质上还是没有解决,因此要向外抛出老师可以传达的异常(由电脑冒烟产生的)

throw new NoPlanException("课时停止!!!");

}

}

public void Test() {

System.out.println("做练习题!!");

}

}

public class ExceptionTest {

public static void main(String[] args) {

Teacher T = new Teacher("Li");

try {

T.Prelect();

}

catch (NoPlanException N) {

System.out.println(N.toString());

Teacher t = new Teacher("liu");

System.out.println("换老师!!");

System.out.println(t.toString());

}

}

}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值