Java基础之Exception

0. about

来源:java.lang中的Throwable类。Throwable有两个重要的子类:Exception(异常)Error(错误)。

0.1 Error && Exception

异常可以被程序本身处理。错误无法处理。

  • Error : 程序无法处理的错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如: outOfMemory.
    • 这些错误往往不可查,他们在程序的控制和处理能力之外。且
  • Exeption : Excepton有一个重要的子类 RuntimeException.由java虚拟机抛出.
    • NUllPointerException(要访问的变量没有引用任何对象时。抛出该异常)
    • ArithmeticException (算术运算异常,一个整数处以0时,抛出该异常)
    • ArrayIndexOutOfBoundsException(下标越界异常)

0.2 什么时候需要抛出异常?为什么抛出异常?

只有Java语言提供了Checked异常,就是必须在编译前处理,否则不予通过编译。即:没有完善处理的代码根本就不会被执行。也就是说Java中除了RuntimeException及其任何子类,其他异常类都被Java异常强制处理机制强制异常处理。

Java异常处理原则之一:延迟捕获


意思是,当异常发生时,不应立即捕获,而是应该考虑当前作用域是否有有能力处理这一异常的能力,如果没有,则应将该异常继续向上抛出,交由更上层的作用域来处理。

1. throws && throw

1.1 throw 关键字

  • 1 异常处理结束后,再将异常抛出.让下一层异常处理块捕捉。直接使用throw new ArithmeticException;
  • 2 程序发生错误无法处理的时候,会自动抛出对应的异常的对象.

1.2 throws 关键字

1.2.1 声明
  • 1.在方法体申明时使用(表明该方法需要抛出这种类型的异常)。 这样编译器会检查调用该方法的代码片断有没有处理该异常。没有处理则编译不通过,强制需要处理。 除了RuntimeException 编译器都要求强制处理。
  • 2.在类声明需抛出的异常。
    • 则允许仅抛出部分异常(某个方法体只抛出类声明抛出异常的其中一个或某几个异常)

    • 允许不在抛出异常。(某个方法体一个异常也不需要抛出)

    • 允许抛出超类方法抛出异常的子类型异常()

    • 不允许额外抛出类声明异常中未声明的异常

    • 不允许抛出超类方法中抛出异常的超类异常。(例如声明了Nullpointer异常,则不可以抛出Exeption。只可以NullPointer)

      	public void setAge(int age) 
      		/**
      		 * 通过throws通知要抛异常。
      		 */
      		throws Exception{
      		if(age>100 || age <= 0){
      			/**
      			 * 除了runtimeException 不需要通知。其他的都需要通知。
      			 */
      			//throw new RuntimeException("年龄不合法");
      			throw new Exception("throw a new exception");
      		}
      		this.age = age;
      	}
      

1.3 异常处理总结

当我们调用一个含有throws声明抛出的异常的方法时,编译器要求我们必须处理该异常。(根据实际开发需求)处理得手段有两种:

  • 使用 try-catch 捕获异常并处理

    • try块: 捕获异常。后接0至多个catch块(当0个时,必须有finally块)。

    • catch块: 用于处理try捕获到的异常。

    • finally块: 无论是否捕获或处理异常。finally块里的语句都会被执行。当try块或者catch块遇到return语句时,finally语句块将在方法返回之前被执行。

    以下4种情况,finally块不会被执行或完全执行

    • 在finally语句块中发生了异常
    • 在前面的代码块中使用System.exit() 退出程序
    • 程序所在的线程死亡
    • CPU关闭
  • 在当前方法中继续使用throws声明该异常,继续向上层抛出。

2. RuntimeException

TODO 01 : 常见的runtime异常有哪些?? ` 		

java 异常分为可检测异常和非检测异常。

  • 可检测异常: 可检测异常经过编译器验证之后,对于声明抛出的异常的任何方法.
    - 编译器将强制执行处理和声明的规则,不捕捉并处理这个异常,编译器将会通不过。编译终止。
  • 非检测异常: 非检测异常不遵循处理或声明规则。
    • 在产生此类异常时,不一定非要采取任何适当的操作,编译器不会检查是否已经处理了该异常。

RuntimeException 类属于非检测异常。 因为普通JVM操作引起的运行时异常随时可能发生。
此类异常一般是由特定操作的引起。但这操作在java应用程序中会频繁的出现。因此他们不受编译器检查与处理或声明规则的限制。

3. 方法

  • printStackTrace()

    • 在控制台上打印Throwable对象封装的异常信息
  • getMessage()

    • 返回异常发生时的详细信息
      • 自定义异常
  • toString()

    • 异常发生时的简要描述。

      使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同

  • getLocalizedMessage()

    • 返回异常对象的本地化信息。

intro: 通常是用来定义业务逻辑上的某种类型的异常错误,声明其不合法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值