Java异常及异常处理机制

1.异常简介

(1)Java异常是Java提供的一种识别及响应错误的一致性机制。从面向对象的角度来说,异常也是一个对象。
(2)处理异常:

方式一:添加判断 if…else

缺点:程序员会把精力放在避免异常,无法集中在业务上了。一直在不漏洞,但是也不一定能补全
业务代码被处理异常的代码淹没了,可读性不强

方式二:异常处理机制: 预置一些异常处理程序—如果异常情况—执行相应的处理程序,这样就不会让程序中断
(3)异常处理机制

关键字作用
try用于监听
catch用于捕获异常
finallyfinally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)
throw用于抛出异常
throws用在方法签名中,用于声明该方法可能抛出的异常
例如:
	try{
		可能出现异常的代码
	}catch(){
		//异常出现的话,如何处理---异常处理程序
	}catch(){
		//异常出现的话,如何处理---异常处理程序
	}
	finally{
		//不管是否出现异常,都会去执行的代码
		//关闭资源 善后、收场
	}
此结构中,try必选,catch和finaly可选,但是必有其一 	
正常情况:执行try,继续后续代码
异常情况:出现异常之后的代码不再执行,转到catch块执行,继续后续代码
          出现异常,系统会产生一个异常对象,会和catch块中捕获的类型匹配
          匹配上才执行其中的代码,匹配不上就报错

多种异常的话,我们可以使用多个catch语句来捕获。从上往下匹配,上面的匹配上,下面的就不再匹配 所以,catch种捕获的异常类型应该从小到大来写,否则会报错,因为有些catch块永远也执行不了

2.异常体系

1.Throwable

  • Throwable 类是 Java 语言中所有错误或异常的超类。

在这里插入图片描述

Error与Exception的区别:

  • Error类对象由 Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

2.异常处理机制
Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
(1)try-catch 语句

try 
{ 
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。
//否则不会执行catch里面的内容 
} 
catch
{  //除非try里面执行代码发生了异常,否则这里的代码不会执行 
}finally{
}

(2) finally语句

  • finally中的代码必须执行

在finally块中发生异常、程序所在线程死亡、在前面的代码中用了System.exit()、关闭cpu以上情形发生之一时finally语句将不会被执行

try 
{ 
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。
//否则不会执行catch里面的内容 
} 
catch
{  //除非try里面执行代码发生了异常,否则这里的代码不会执行 
}finally{
//不管什么情况都会执行,包括try catch 里面用了return 
//可以理解为只要执行了try或者catch,就一定会执行 finally 
}

(3)throw抛出异常

  • Java中使用throw关键字抛出异常
  • 定义:一个方法不处理这个异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理
  • throw:表示方法内抛出某种异常对象
    如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
  • 执行到 throw 语句则后面的语句块不再执行

(4)throws语句

  • throws是用来声明一个方法可能抛出的所有异常信息。
  • throws对异常不处理,谁调用谁处理
  • 如果是检查异常,那么调用者必须捕获或再次抛出
  • 如果是非检查异常或者没有直接调用的地方,都是可以交给jvm来处理
  • throws在使用时应处于方法签名之后使用,可以抛出多种异常并用英文字符逗号’,’隔开。
  • thorws语法格式:
  [(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{
             }      
public void function() throws Exception{
}

3.自定义异常

  • 如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常。如果要自定义非检查异常,则扩展自RuntimeException。继承Exception还是继承RuntimeException是由异常本身的特点决定的,,而不是由是否是自定义的异常决定的。
  • 自定义的异常应该总是包含如下的构造函数:
    一个无参构造函数
    一个带有String参数的构造函数,并传递给父类的构造函数。
    一个带有String参数和Throwable参数,并都传递给父类构造函数
    一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
例如:
class WrongInputException extends Exception {  // 自定义的类
    WrongInputException(String s) {
        super(s);
    }
}
class Input {
    void method() throws WrongInputException {
        throw new WrongInputException("Wrong input"); // 抛出自定义的类
    }
}
class TestInput {
    public static void main(String[] args){
        try {
            new Input().method();
        }
        catch(WrongInputException wie) {
            System.out.println(wie.getMessage());
        }
    } 
}

以上代码运行输出结果为:

Wrong input

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿吹吹吹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值