throw、throws处理异常的常用方法

本文深入探讨Java中的异常处理机制,包括异常的概念、分类、常见异常类型及如何使用try-catch-finally、throws和throw进行异常处理。此外,还介绍了自定义异常类的创建方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述:

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。异常本质就是Java当中对可能出现的问题进行描述的一种对象体现。
  • 一些常见异常:
    除数不能为0异常(ArithmeticException)
    空指针异常(NullPointException)
    数组越界异常(ArrayIndexOutOfBoundsException)
    类型转换异常(ClassCastException)
  • 异常分类
    在这里插入图片描述

Error:称为错误,由Java虚拟机生成并抛出,程序对其不做处理。

Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。

RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常。

  • 如果我们不做任何处理,异常将会交由虚拟机来处理
    虚拟机的处理方式:
    把异常的名称,异常出现的位置,异常原因,等信息输出打印在控制台,并同时将 程序停止执行。这种方式显然不行,因此要自己实现
    (1) try…catch…finally
    ( 2)throws抛出异
  • try…catch…finally
    处理格式:
         try{
	        //放置程序可能出现问题的代码
         }catch(异常类  异常名){
	       //这里放置异常处理的代码
         } finally{
 	      //释放资源
         }
  • 异常执行的三种情况:
    1.没有发生异常的程序执行流程
	System.out.println("Start Application");
		int[] arr = new int[3];
		try {
			System.out.println(arr[2]);
		} catch (ArrayIndexOutOfBoundsException aioobe) {
			System.out.println("数组越界,出问题2");	
		} 		
		System.out.println("End");

执行结果:
在这里插入图片描述
2.发生异常并捕获异常

System.out.println("Start Application");
		int[] arr = new int[3];
		try {
			System.out.println(arr[4]);
		} catch (ArrayIndexOutOfBoundsException aioobe) {
			System.out.println("数组越界,出问题2");	
		} 		
		System.out.println("End");

运行结果:
在这里插入图片描述
3.异常类型不匹配

	System.out.println("Start Application");
		int[] arr = new int[3];
		try {
			System.out.println(arr[2]);
		} catch (ArrayIndexOutOfBoundsException aioobe) {
			System.out.println("数组越界,出问题2");	
		} 		
		System.out.println("End");

运行结果:
在这里插入图片描述

2. Thowable类

1.概述:
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
成员方法
public String getMessage():返回此 throwable 的详细消息字符串
public String toString():获取异常类名和异常信息。
public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。

3.throws

在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。

  • throws使用格式
    [修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2…]{
    }
  • 注意:
    1、如果一个方法声明的是编译时期异常,则在调用这个方法之处必须处置这个异常(谁调用谁处理)。
public static void main(String[] args) {
		System.out.println("start");
		try {
			method();
		} catch (Exception e) {
			e.printStackTrace();
		}		
		System.out.println("end");
	}
	private static void method() throws ArithmeticException{
		method2();
	}
	private static void method2() throws ArithmeticException, NullPointerException {
		int a =10;
		int b = 0;
		System.out.println(a / b);
	}

2、重写一个方法时,它所声明的异常范围不能被扩大。

class Fu {
	public void show() throws NullPointerException {		
	}
}
class Zi extends Fu {
	@Override
	public void show() throws Exception {
	}							错误的写法,异常范围较父类大
}

4.throw

throw和throws的区别

  • throws用在方法声明后面,跟的是异常类名,throw用在方法体内,跟的是异常对象名。
  • throws可以跟多个异常类名,用逗号隔开,throw只能抛出一个异常对象名。
  • throws表示抛出异常,由该方法的调用者来处理,throw表示抛出异常,由方法体内的语句处理。
  • throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常。

5.finally

  • 概述
    1.finally修饰代码块一定会被执行,除非碰到程序退出
    System.exit(0);
    Runtime.getRuntime().exit(0);
    2.一般用来释放内存资源,比如关闭IO流的输入输出对象,数据库连接对象等等…
  • return和finally的执行顺序?
    在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
    在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
    因此,即使finally中对变量x进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。
	System.out.println(test());
	}
	public static int test() {
		int x = 1;
		try {
			x++;
			return x;
		} finally {
			++x;
			System.out.println(x); 
		}

执行结果:
在这里插入图片描述
(先执行finally后return)

6.自定义异常类

  • 步骤:
    1 定义一个异常继承Throwable或者Exception或者RuntimeException
    2 编写构造方法:带参 无参
    例如:编写一个分数必须在0-100分之间的异常,并且使用这个异常;
编写异常类
class scoreException extends Exception{
	private static final long serialVersionUID = 1L;
	public scoreException() {};
	public scoreException(String s) {
		super(s);
	};	
}
class teacher {
	public boolean checkScore(double score) throws scoreException {
		if (score<0||score>100) {
			throw new scoreException("输入不合法");
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("输入分数");
		double score = input.nextDouble();
		teacher te = new teacher();
		try {
			te.checkScore(score);
			System.out.println("录入成功");
		} catch (scoreException e) {
			e.printStackTrace();
		}finally {
			input.close();
		}
		System.out.println("批改完毕");		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值