JavaSE之异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_1018944104/article/details/82793348

目录

1.什么是异常

2.异常分类

3.常见的异常类型(面试的时候常问到)

4.异常处理方式

4.1.Java处理异常的5个关键词:

4.2.异常处理方式

4.3.异常处理原则

5.程序调试


1.什么是异常

异常就是非正常情况导致程序的执行流程发生改变。

2.异常分类

Java异常继承图如下(自己画出来):

说明:

  • Error:错误,用代码处理不了,一般是虚拟机出现了问题
  • Exception:异常,用代码可以处理
  • 运行时异常:RuntimeException及其子类,开发过程中遇到的最多。编译可以通过,在运行期出现问题导致程序中断。
  • 非运行时异常(受检异常):Exception及其部分子类。编译期出现的问题,这个必须处理否则编译不通过。

3.常见的异常类型(面试的时候常问到)

Excepiton 异常层次结构的根类
常见异常类型 说明
ArithmeticException 算术错误情形,比如零作为除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问null对象的成员(空指针异常)
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到的数据类型与实际输入类型不匹配
IIIegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式化异常,如把“abc”转换成数字

4.异常处理方式

4.1.Java处理异常的5个关键词:

  • try:执行可能产生异常的代码
  • catch:捕获处理异常
  • finally:无论是否发生异常,代码总能执行
  • throws:声明方法可能要抛出的各种异常
  • throw:手动抛出异常

4.2.异常处理方式

1)try-catch

语法:

try{
//可能会出现异常的代码
}catch(异常类类型 对象名){
//处理异常
}

说明:

  • 没有异常:try执行,catch不执行
  • 异常类型匹配:try执行,catch执行
  • 异常类型不匹配:try执行,catch不执行

2)多重catch处理

编写顺序(从上到下):

  • 由普通异常到特殊异常;
  • 由子类异常到父类异常。

3)try-catch-finally

语法:

try{
//可能会出现异常的代码
}catch(异常类类型 对象名){
//处理异常
}finally{
//一定会执行的代码,不管前面是什么异常,还是使用return关键词
}

说明:

  • System.exit(0):关闭虚拟机,这是唯一一种情况finally块不执行的情况。
  • 几种组合方式
    • try-catch
    • try-finally
    • try-catch-finally

示例:

import java.util.InputMismatchException;
import java.util.Scanner;
public class TestExcepiton3 {
	public void a(){
		Scanner input = new Scanner(System.in);
		int n1,n2,n3;
		System.out.println("输入两个数字:");
		try {
			n1 = input.nextInt();
			n2 = input.nextInt();
			n3 = n1 / n2;
			System.out.println(n3);
		} catch (ArithmeticException e) {
			System.out.println(("出错了,请与管理员联系"));
		}catch (InputMismatchException e) {
			System.out.println(e);//展示异常对象的描述信息
			System.out.println(e.getMessage());//异常的消息
			e.printStackTrace();//堆栈轨迹信息
		}catch (Exception e) {
			System.out.println(e);
		}finally{
			System.out.println("其他代码……");
		}
	}
	public static void main(String[] args) {
		new TestExcepiton3().a();
	}
}

4)throws关键词声明异常

通过throws关键词可以抛出多个异常,多个异常之间用逗号隔开,结果会把异常抛给调用者。调用者的处理方式:

  • 受检异常:调用者必须处理
  • 运行异常:调用者非必须处理

5)throw关键词抛出异常

手动抛出异常,如果抛出的是运行时异常,可以不用throws声明,但若是受检异常,则必须throws声明。

6)自定义异常类

如何自定义异常类?

  • 继承系统定义的异常类;
  • 重写父类的方法。
    • public String getMessage();
    • public void printStackTrace();
    • public String toString();

示例:

class AgeException extends RuntimeException{
	String smessage;
	public AgeException(String smessage) {
		this.smessage = smessage;
	}
	@Override
	public String getMessage() {
		return "getMessage:" + smessage;
	}
	@Override
	public void printStackTrace() {
		System.out.println("printStackTrace:" + smessage);
	}
	@Override
	public String toString() {
		return "toString:" + smessage;
	}
}
class Person{
	private String sex;
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		/*if (sex.equals("男") && sex.equals("女")) {
			this.sex = sex;
		} else {
			throw new Exception("输入的不符合要求,必须输入男或女");
		}*/
		if (sex.equals("男") && sex.equals("女")) {
			this.sex = sex;
		} else {
			throw new AgeException("输入的不符合要求,必须输入男或女");
		}
	}
}
public class TestPerson {
	public static void main(String[] args) {
		Person p = new Person();
		try {
			p.setSex("lala");
		} catch (AgeException e) {
			e.printStackTrace();
			System.out.println(e);
			System.out.println(e.getMessage());
		}
	}
}

4.3.异常处理原则

  • 只用于处理非正常的情况;
  • 避免过大的try;
  • 使用多重catch;
  • 不要忽略catch块中的异常;
  • 改正代码;
  • 文档声明。

5.程序调试

程序调试步骤如下:

  • 分析错误,设置断点;
  • 启动调试(debug);
  • 单步运行(F5单步跳入,F6单步跳过);
  • 观察变量;
  • 发现问题;
  • 修正代码,重新运行;
  • 解决问题。

猜你喜欢

转载自blog.csdn.net/qq_1018944104/article/details/82793348