Java——异常

异常概述
异常:就是程序出现了不正常的情况

异常体系
在这里插入图片描述
Error:严重问题,不需要处理
Exception:称为异常类,它表示程序本身可以出来的问题

  • RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码
  • 非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了

JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理

  • 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行
    例如:
public class Demo {
	public static void main(String[] args) {
		System.out.println("开始");
		method();
		System.out.println("结束");
	}

	public static void method() {
		int[] arr = { 1, 2, 3 };
//		System.out.println(arr[1]);
		System.out.println(arr[3]);

	}
}

运行结果:
在这里插入图片描述
异常处理

如果程序出现了问题,我们需要自己来处理,有两种方案:

  • try…catch…
  • throws

异常处理之 try…catch…

格式:

try {
			可能出现异常的代码;
		}catch(异常类名 变量名) {
			异常的处理代码;
		}

执行流程:
程序从try里面的代码开始执行
出现异常,会自动生成一个异常类对象,该异常对象将会被提交给Java运行时系统
当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行

//try {
//	可能出现异常的代码;
//}catch(异常类名 变量名) {
//	异常的处理代码;
//}

public class Demo {
	public static void main(String[] args) {
		System.out.println("开始");
		method();
		System.out.println("结束");
	}

	public static void method() {
		try {
			int[] arr = { 1, 2, 3 };
//		System.out.println(arr[1]);
			System.out.println(arr[3]);// new ArrayIndexOutOfBoundsException();
		} catch (ArrayIndexOutOfBoundsException e) {
//			System.out.println("你访问的数组的索引不存在");
			e.printStackTrace();

		}

	}
}

运行结果:
在这里插入图片描述
Throwable的成员方法

方法名说明
public String getMessage()返回此throwable的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台
//public String getMessage()   返回此throwable的详细消息字符串
//public String toString()返回此可抛出的简短描述
//public void printStackTrace()把异常的错误信息输出在控制台

public class Demo {
	public static void main(String[] args) {
		System.out.println("开始");
		method();
		System.out.println("结束");
	}

	public static void method() {
		try {
			int[] arr = { 1, 2, 3 };
			System.out.println(arr[3]);// new ArrayIndexOutOfBoundsException("xxx");
		} catch (ArrayIndexOutOfBoundsException e) {
//			e.printStackTrace();

			// public String getMessage() 返回此throwable的详细消息字符串
//			System.out.println(e.getMessage());
			// 出现异常的原因 Index 3 out of bounds for length 3

			// public String toString()返回此可抛出的简短描述
//			System.out.println(e.toString());
			// 异常的类名和原因 java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for
			// length 3

			// public void printStackTrace()把异常的错误信息输出在控制台
			e.printStackTrace();
			// 异常的类名,原因和信息
			// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
			// at hellojava/YiChang.Demo.method(Demo.java:17)
			// at hellojava/YiChang.Demo.main(Demo.java:10)
		}

	}
}

编译时异常和运行时异常的区别

Java中的异常被分为两大类:编译时异常运行时异常,也别称为受检异常非受检异常

所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常

  • 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常:无需显示处理,也可以和编译时异常一样处理
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

//编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
//运行时异常:无需显示处理,也可以和编译时异常一样处理

public class Demo2 {
	public static void main(String[] args) {
		method();
		method2();
	}

	// 编译时异常
	public static void method2() {
		try {
			String s = "2021-08-01";
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
			Date d = sdf.parse(s);
			System.out.println(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}

	}

	// 运行时异常
	public static void method() {
		try {
			int[] arr = { 1, 2, 3 };
			System.out.println(arr[3]);// ArrayIndexOutOfBoundsException
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		}
	}

}

运行结果:
在这里插入图片描述
异常处理之throws

虽然通过try…catch…可以对异常进行处理,但是并不是所有的情况都有权限进行异常的处理
也就是说,有些时候可能出现的异常是我们处理不了的
针对这种情况,Java提供了throws的处理方案

格式:

	thorws 异常类名;

注意:这个格式是跟在方法的括号后面的

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

//编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
//运行时异常:无需显示处理,也可以和编译时异常一样处理

public class Demo2 {
	public static void main(String[] args) {
		System.out.println("开始");
//		method();

		// 还是需要处理异常
		try {
			method2();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("结束");
	}

	// 编译时异常
	public static void method2() throws ParseException {// 抛出异常,仅是减缓异常
		String s = "2021-08-01";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
		Date d = sdf.parse(s);
		System.out.println(d);

	}

	// 运行时异常
	public static void method() throws ArrayIndexOutOfBoundsException {// 抛出异常,并没有处理,程序不会往下执行
		int[] arr = { 1, 2, 3 };
		System.out.println(arr[3]);// ArrayIndexOutOfBoundsException

	}

}

  • 编译时异常必须要进行处理,两种处理方案:try…catch…或者throws,如果采用throws这种方案,将来谁调用谁处理
  • 运行时异常可以不处理,出现问题后,需要我们回来修改代码

自定义异常

格式:

public class 异常类名 extends Exception{
	无参构造
	带参构造
}

举例:


//自定义异常类
//成绩异常
public class ScoreException extends Exception//要继承exc
	//无参构造
	public ScoreException() {}
	//带参构造
	public ScoreException(String message) {
		super(message);
	}
}
//教师类
import java.util.Scanner;

public class Teacher {
	public void checkScore(int score) throws ScoreException{//要将 异常类 抛出来
		if(score<0||score>100) {
//			throw new ScoreException();//throw关键字 用于方法体内部 抛出异常对象
			//使用带参构造方法,显示错误原因
			throw new ScoreException("你给的分数有误,分数应该在0--100之间");
		}else {
			System.out.println("分数正常");
		}
	}
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入分数:");
		int s=sc.nextInt();
		Teacher t=new Teacher();
		//编译时异常,需要处理
		try {
			t.checkScore(s);
		} catch (ScoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

运行结果:
在这里插入图片描述
throws和throw的区别

throws

  • 用在方法声明后面,跟的是异常类名
  • 表示抛出异常,由该方法的调用者来处理
  • 表示出现异常的一种可能性,并不一定会发生这些异常

throw

  • 用在方法体内,跟的是异常对象名
  • 表示抛出异常,有方法体内的语句处理
  • 执行throw一定抛出了某种异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值