Java面向对象之异常处理机制(try-catch-finally、throws、自定义异常)

一、异常与异常分类

1、错误(Error)
在编译时就报出了的叫做错误,比如语法错误、逻辑错误等,这属于代码的基本错误。
1.1.1

2、编译型异常(Exception)
编译型异常,是指在编译过程中就出现的异常信息。编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有编译时异常。

对于这类异常,如果程序不处理,可能会带来意想不到的结果。比如:tan90°、除法中分母为0等。

3、运行时异常(untimeException)
一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常java.lang.RuntimeException类及它的子类都是运行时异常。
对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。

常指代码一般能够编译通过,但在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,也就是所谓的运行时异常,

4、Java程序在执行过程中所发生的异常事件可分为两类
(1)Error: Java虚拟机无法解决的严重问题。 如: JVM系统内部错误、 资源耗尽等严重情况。比如: StackOverflowError和OOM。 一般不编写针对性的代码进行处理。

(2)Exception: 其它因编程错误或偶然的外在因素导致的一般性问题, 可以使用针对性的代码进行处理。

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

4、注意
(1)在运行程序过程中遇到异常时,程序会被迫终止执行下去,直接抛出异常警告。
(2)程序员在编写程序时, 就应该考虑到错误的检测、 错误消息的提示, 以及错误的处理。

二、异常处理机制

1、try-catch处理

public class Test07_Whale extends Test07_Mammal{
    
    
	public static void main(String[] args) {
    
    
		try{
    
    
			System.out.println(1/0);
		}catch(Exception e){
    
    
			e.printStackTrace();  //输出错误信息
			System.out.println("程序执行出错了!");
		}
		
		System.out.println("--------------------------this is bottom-------------------------" );
	}
}

2.1.1

2、try-catch-finally处理

不管有没出错,都会执行的代码段,常作为收尾工作的存放位置。

public class Test07_Whale extends Test07_Mammal{
    
    
	public static void main(String[] args) {
    
    
		try{
    
    
			System.out.println(1/1);
		}catch(Exception e){
    
    
			e.printStackTrace();  //输出错误信息
			System.out.println("程序执行出错了!");
		}finally{
    
    
			System.out.println("终究还是我来执行收尾工作……");
		}
		
		System.out.println("--------------------------this is bottom-------------------------" );
	}
}

2.2.1
2.2.2

3、throws可能抛异常(少用)

在方法声明处加上throws Exception即表示该方法可能会抛出异常;

	//声明一个可能抛异常的方法
	public void read() throws Exception{
    
    
		System.out.println(1/0);
		System.out.println("上面的代码有异常!");
	}

原则:产生的异常尽可能自己处理,少向外抛出,否则会越抛越远,越来越难处理。

4、throw抛出异常(少用)

若使用throw,则表示要向外抛出异常,抛出的只能是异常对象,需要new Exception();

public class Test07_Whale extends Test07_Mammal{
    
    
	//声明一个可能抛异常的方法
	// public void read() throws Exception{
    
    
		// System.out.println(1/0);
		// System.out.println("上面的代码有异常!");
	// }
	
	//定义一个除法运算的方法
	public static void cul(int a, int b) throws Exception{
    
    
		if(b==0){
    
    
			throw new Exception("小学没毕业么?分母不能为0!!!");
		}else{
    
    
			System.out.println("a/b= " + a/b);
		}
	}
	public static void main(String[] args) {
    
    
		try{
    
    
			cul(22,1);  //调用除法的方法
		}catch(Exception e){
    
    
			e.printStackTrace();  //打印异常信息
		}
		
		System.out.println("--------------------------this is bottom-------------------------" );
	}
}

2.4.1
2.4.2

三、自定义异常

1、简单说明
这是最自由的一种异常抛出和处理,可以用自己的方式类呈现出异常的表现形式,使用时需要写一个类,并且继承于Exception类。
原则:尽可能少自己定义异常,否则会给同事和团队的开发难度加大,给他们造成不必要困扰。

2、测试练习

class Test07_Mammal{
    
      //哺乳动物类
	String name;
	int age;
	
	//定义类的构造方法
	public Test07_Mammal(String name, int age){
    
    
		this.name = name;
		this.age = age;
	}
}
class AdultException extends Exception{
    
      //自定义异常的类
	public AdultException(String msg){
    
      //自定义异常类构造方法
		super(msg);  //调用Exception父类的构造方法
	}
}
public class Test07_Whale{
    
      //鲸鱼类
	//鲸鱼类的普通方法
	public void how_old(Test07_Mammal tm) throws AdultException{
    
    
		if(tm.age>=18){
    
    
			System.out.println(tm.name + ",你已经是一只成年鲸鱼了,应该要独当一面了!");
		}else{
    
    
			//抛出异常
			throw new AdultException("抛出异常!" + tm.name + ",你还未成年,不可以独当一面。");  //年龄不对的异常
		}
	}
	
	//注意:因为鲸鱼类中的普通方法抛出了异常,
	//因此调用这个方法的主方法中,也要定义为可能抛出异常
	
	//鲸鱼类的主方法(测试)
	public static void main(String[] args) throws AdultException{
    
    
		//创建哺乳动物对象
		Test07_Mammal tm1 = new Test07_Mammal("白鲸", 19);
		Test07_Mammal tm2 = new Test07_Mammal("蓝鲸", 15);

		//创建鲸鱼类:
		Test07_Whale tw1 = new Test07_Whale();
		// Test07_Whale tw2 = new Test07_Whale();
		
		//调用鲸鱼类的方法:传入定义好的白鲸、蓝鲸对象
		tw1.how_old(tm1); 
		// tw2.how_old(tm2);
	}
}

3.2.1
3.2.2

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/119983174