一篇文章带你解决异常处理入门

文章目录

    • 异常
    • 处理异常的过程
    • 异常的分类
    • 如何处理异常
      • 1.使用try-catch语句捕获异常;
      • 2.使用throws声明异常
    • 自定义异常

异常

程序在运行工程中遇到的一些问题成为异常(Exception)
当程序出现异常时,程序可以安全的退出

处理异常的过程

Java采用面向对象的方式处理异常
抛出异常:发生异常时生成代表此异常的对象,停止程序的运行,并将异常对象提交给虚拟机(JRE)
捕获异常:虚拟机捕获到异常后寻找相应的代码处理异常;JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止

异常的分类

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,
Throwable派生了两个子类:Error和Exception
Error表示系统JVM已经处于不可恢复的崩溃状态,是程序无法处理的错误
Exception表示程序本身能够处理的异常,是所有异常的父类,子类对应了各种各样可能出现的异常事件;Java中的异常可分为运行时异常和已检查异常

如何处理异常

运行时的异常:系统会自动检测并将异常交给缺省的异常处理程序;此类异常通常是程序编写时的错误导致的,可以通过对代码的逻辑处理来解决异常

已检查异常:在进行编译时就必须做出处理,否则无法通过编译
两种已检查异常处理方式:

1.使用try-catch语句捕获异常;

try-catch-finally语句捕获异常,使用try执行一段程序,若出现异常系统就将抛出一个异常,并且不再执行后面的语句,代码中可能会产生并抛出一种或几种类型的异常对象,可以通过他的类型来catch并处理,并且至少有一条catch语句甚可以有多条catch语句;finally语句为异常处理提供了一个统一的出口,最多只能有一条;当异常处理的代码执行结束以后,不会回到try语句去执行尚未执行的语句。

catch中常用方法均继承自Throwable类 。

  1. toString ()方法,显示异常的类名和产生异常的原因
  2. getMessage()方法,只显示产生异常的原因,但不显示类名。
  3. printStackTrace()方法,用来跟踪异常事件发生时堆栈的内容。

catch捕获异常时的捕获顺序:
如果异常类之间有继承关系,在顺序安排上需注意。越是顶层的类,越放在下面,再不然就直接把多余的catch省略掉。 也就是先捕获子类异常再捕获父类异常。

finally语句的执行:
即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。
finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。

public static void main(String[] args) {
		FileReader fileReader = null;
		try {
			fileReader = new FileReader("e:/test.txt");
			char c = (char)fileReader.read();//读取文件中的字符
			System.out.println();
		} catch (FileNotFoundException e) { //捕获异常的类型
			e.printStackTrace();  //打印异常的信息
		} catch (IOException e) { //为FileNotFoundException的父类
			e.printStackTrace();  //catch时子类在前父类在后 若顺序不对,异常将全部进入父类,子类的异常捕获将永远用不到,编译器会报错
		}finally{
			try {
				if (fileReader != null) {
					fileReader.close();	
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	//在try语句中打开文件,如果出现异常后面的语句将不执行,进入第一个catch语句捕获异常,并且在控制台上打印相关的错误,最后进入finally语句结束

2.使用throws声明异常

将异常抛给调用的方法,谁调用了谁处理
如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

public static void main(String[] args) throws IOException {
		FileReader fileReader = null;
		fileReader = new FileReader("e:/test.txt");
		char c = (char)fileReader.read();//读取文件中的字符
		System.out.println(c);
		if (fileReader != null) {
			fileReader.close();
		}	
	}

自定义异常

自定义异常:JDK提供的任何标准异常都无法充分表达清楚问题时创建自己的异常类;
自定义异常类只需从Exception类或者它的子类派生一个子类即可。
自定义异常类如果继承Exception类,则在编译时进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。
自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

public class TestException {
	public static void main(String[] args) {
		Person person = new Person();
		person.setAge(-18);
	}
}
class Person{
	private int age;
	public int getAge(){
		return age;
	}
	public void setAge(int age){
		if (age < 0) {
			throw new IllegalAgeException("年龄不能为负数"); //手动抛出异常
		}
		this.age = age;
	}
}
class IllegalAgeException extends RuntimeException{ //自定义异常
	public IllegalAgeException(){ //构造器
		
	}
	public IllegalAgeException(String ageString){ //带有参数的构造器
		super(ageString);
	}
}

在这里插入图片描述

你可能感兴趣的:(Java,java)