[Java学习]异常

一、异常

异常基本概念

  • 异常用类表示,类的对象表示具体异常事件。
  • 当出现异常Java虚拟机会new一个异常对象。
  • 异常对象输出的异常信息,可以帮助我们完善程序,处理异常,使程序更健壮。

异常继承关系结构图

  • Throwble有两个子类Error和Exception:错误不能处理,直接退出jvm;异常可以处理,但不处理也会退出jvm。
  • Exception的直接子类及直接子类的子类都是编译时异常,Exception的子类RuntimeException的子类是运行时异常。编译时异常指发生几率大的异常,运行时异常指发生几率小的异常。编译时异常需要程序员处理:两种方法:捕捉:try catch 、声明抛出:throw。

二、处理异常的两种方法

处理异常方法一:throws

编译时异常示例
  • 因为FileInputStream的构造方法中抛出了 FileNotFoundException,所以能得到异常。而FileNOtFoundException 继承IOException,IOException直接继承Exception,所以这个异常是编译时异常。
  • 解决方法,可以在函数声明的地方throws相应异常。
关于throws

throws是向上抛,抛给调用它的,当主函数throws,编译阶段会通过,但运行会打印出异常信息,jvm虚拟机会结束程序。
也就是,throws实际是在“推卸责任给上层”。

处理异常的方法二:try catch

语法
try{
    语句
}
catch(异常类型1 变量名1){//JVM自动创建一个异常类型1的对象,将该对象的内存地址赋值给变量1。
    对异常1的处理
}
catch(异常类型2 变量名2){
    对异常2的处理
}
注意:
  • catch由上到下要是由小异常到大异常(子类到类)
  • 只会执行一个catch
try catch底层实现

catch是一个方法,异常类型的对象作为它的参数。

调用异常对象的printStackTrace()或getMessage()来调试异常
try{
    语句
}
catch(FileNotFoundException e){
    e.printStackTrace();//打印异常堆栈信息,信息更全,推荐。
    //e.getMessage();//打印异常描述信息
}

三、异常中的finally语句块

finally

finally语句块中的代码一定会执行,除非在try中exit(0)即退出了JVM。
语法
try{
}
finally{
}
try{
}
catch{
}
finally{
}

finally作用:把需要释放的资源写在finally里,保证资源一定被释放。

区分完全无关的finally final finalize

final关键字:在面向对象中提到,final修饰的类无法被继承,final修饰的方法无法被覆盖...
finalize是object类的一个方法:垃圾回收机制在回收Java对象之前,会先调用对象的该方法。
finally语句块:异常机制中的,见上。

四、自定义异常

例子

package com.test.jinhj;

//可以选择作为编译时异常还是运行时异常,这里继承Exception,所以是编译时异常
public class UserNameShortException extends Exception {
	public UserNameShortException() {}
	public UserNameShortException(String message) {
		super(message);
	}
}
package com.test.jinhj;

public class Register  {
	public void register(String name) throws UserNameShortException{
		if(name.length()<6) {
			//手动抛出异常
			throw new UserNameShortException("用户名必须大于6位!");
		}
		System.out.println(name);
	}
}
package com.test.jinhj;

public class RegisterTest {
	public static void main(String[] args) {
		Register person=new Register();
		try {
			String name="gaga";
			person.register(name);
		}
		catch(UserNameShortException e){
			e.printStackTrace();
		}
	}

}

异常机制与方法的覆盖

(子类)重写的方法只能比(父类)被重写的方法抛出更“小”的异常 。???why

posted on 2019-03-14 22:45  coding_gaga  阅读(149)  评论(0编辑  收藏  举报

导航