异常Exception

  • 概念
  • 异常分类
  • 异常处理机制
  • 异常抛出
  • 自定义异常



概念

  • 在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。在Java中,把各种异常现象进行了抽象形成了异常类
  • 异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
  • 程序错误分为三种:
  • 编译错误:程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置。
  • 运行时错误:程序在执行时,运行环境发现了不能执行的操作。
  • 逻辑错误:程序没有按照预期的逻辑顺序执行。

异常分类

  • 异常类结构(不完整):

java 逻辑报错该如何返回_面向对象编程


  • 通常,Java的异常分为受查异常(checked exceptions)和非受查异常(unchecked exceptions)。
  • 受查异常: 包括Exception及其子类(不包括运行时异常,即RuntimeException与其子类),这种异常的特点是Java编译器会检查它,必须处理后才能通过编译。
  • 非受查异常: 包括运行时异常(RuntimeException与其子类)和Error,表示程序中出现了编程错误,应该找出错误修改程序。

异常处理机制

  • try:监控区域,执行可能产生异常的代码,不能单独出现。当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。
  • catch:捕获、处理异常。一般按照由小到大的顺序捕获,也就是先截获子异常,再截获父异常。
  • finally:善后处理,无论是否发生异常,代码总能执行。finally必须和try一块使用。
  • 如果在catch中遇到了return或者异常等能使该函数终止的话那么有finally就必须先执行完finally代码块里面的代码然后再返回值。
  • 一般格式:
try {
	
	} catch (OneException e) {
	     
	} catch (TwoException e) {
	
	} finally {
	
	}

或者:

try {
	
	} catch (OneException e1|TwoException e2) {  //从小到大用|隔开
	
	}finally {
	
	}
  • 示例:
class Person{
	String name;
}

public class Test {
	public static void main(String[] args) {	
		Person p = null;
		try{			
			p.name = "我是一个不能赋值给null的字符串";			
		}catch(java.lang.NullPointerException e1){ //捕获指针异常
			System.out.println("空指针异常");				
		}finally{
			System.out.println("end1");
		}
		
		try{
			System.out.println(100 / 0);
		}catch(Exception e2){ //捕获所有异常
			System.out.println("0不能作为分母出现!请回小学补习算术");	
		}finally{
			System.out.println("end2");
		}
	}
}
  • 输出:
空指针异常
end1
0不能作为分母出现!请回小学补习算术
end2

异常抛出

  • throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常
  • throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理
  • throw用在方法内,后面跟上要抛出的异常类对象;throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上要抛出的异常类名
  • 示例:
class Bar{
	int age;
	public Bar(int age){
		this.age = age;
	}
	void check()throws IllegalArgumentException{ 	//throws 声明标识可能出现的异常
		if(age < 18){
			throw new IllegalArgumentException("年龄不符合要求");	//throw 抛出异常
		}
	}
	
}

public class Test {
	public static void main(String[] args) {	
		Bar b = new Bar(15);
		try{
			b.check();
		}catch(IllegalArgumentException e){
			System.out.println(e.getMessage()); //打印返回异常的详细消息字符串
			e.printStackTrace(); //追踪堆栈异常信息
		}
		System.out.println("end");
	}
}
  • 输出:
年龄不符合要求
end
java.lang.IllegalArgumentException: 年龄不符合要求
	at Bar.check(Test.java:8)
	at Test.main(Test.java:18)

自定义异常

  • 自定义异常类必须从已有的异常类继承
  • 建立新的异常类型最简单的方法就是让编译器产生默认构造方法
  • 对异常来说,最重要的部分就是它的类名
  • 可以为异常类定义一个接收字符串参数的构造方法,字符串参数描述异常信息
  • 格式:
public class CustomException extends Exception {

	//无参构造方法
	public CustomException(){
		
		super();
	}
	
	//有参的构造方法
	public CustomException(String message){
		super(message);
		
	}
	
	// 用指定的详细信息和原因构造一个新的异常
	public CustomException(String message, Throwable cause){
		
		super(message,cause);
	}
	
	//用指定原因构造一个新的异常
	 public CustomException(Throwable cause) {
		 
		 super(cause);
	 }
	
}
  • 示例
class Bar{
	int age;
	public Bar(int age){
		this.age = age;
	}
	void check()throws myException{ 
		if(age < 18){
			throw new myException("年龄不符合要求");	
		}
	}
	
}

class myException extends Exception{
	
	private String message;
	public myException(String message){
		super(message);
	}
}

public class Test {
	public static void main(String[] args) {	
		Bar b = new Bar(15);
		try{
			b.check();	
		}catch(myException e){
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		System.out.println("end");
	}
}
  • 输出:
年龄不符合要求
myException: 年龄不符合要求
	at Bar.check(Test.java:8)
	at Test.main(Test.java:26)
end

❤️ 本回完! ❤️ ❤️ ❤️