异常小结

异常: java中有三种错误:

1.语法错误/编译错误:

 在ide(集成开发环境)工具(eclipse,myeclipse等)
 中写代码,代码写错了,在工具中用红波浪线或红叉
 来表示,如果现实红波浪线,此代码是不能通过工具
 进行编译的,不能编译,就不能执行

2.逻辑错误:

 前提是语法没有错误,程序能编译,能运行,但结果是错误的
 一般原因就是代码的逻辑写错了,最终结果也是错的

3.运行错误/异常/例外:

前提是逻辑没有错误,但在运行期间因为某种原因导致错误
程序意外终止,这种错误就叫做异常
一定要注意,异常是运行期间发生的
 比如:
    int num1,num2;这个两个值需要从键盘录入
	int result=num1/num2;
	  如果num2录入的是非零值,程序可以正常运行,没有异常
	  如果num2录入的是零值,程序怒能正常运行,代码逻正确,有异常,且程序终止

有了异常,最直接的结果,就是程序终止了,这不是程序的目的
所以要处理异常,处理异常的目的有两个

- 避免程序意外终止
- 如果出现了异常,程序不能终止,还要给一个友好提示

程序意外终止:就是程序执行到某一行位置的时候,不执行了
jvm就不再继续执行这个程序了

处理的方案有两种

方案一:
用java代码提供的异常处理机制 try catch finally
方案二:
用java的逻辑代码来处理,即用java代码来容错

用java的try catch finally的一些相关的注意事项

  • 一般情况下,try块中监视的代码,需要程序员猜测try块中
  • 有多少种可能产生的异常,在try块中的代码可能有n种异常,那么就在try块的下面写n个catch,且catch抓取的异常类型是不同的
  • 如果发生了异常但是,没有catch来抓住,程序还是意外终止的,
  • 为了解决这个问题,需要添加第n+1个catch,这个catch的异常类型是Exception异常类型,即catch(Exception e),且此catch必须放在所有的catch的最后

一个try 可以有零个或一个或多个catch
一个try可以没有catch,但必须有finally

什么是finally:
finally块中放置若干java代码,一般情况下,finally块中的代码是用来释放try块中种申请的内存空间

try块中如果有异常,会抛出异常,在某一个catch块接收到系统抛出
的异常(必须保证catch抓取的异常类型,跟抛出的异常类型相同)
,然后对应catch块中的代码就被执行了,catch块一般有两类代码,

一个是栈的轨迹 (开发期间)
一个是友好的交互或提示的代码
执行完当前catch块中的代码后,会跳过后面所有的catch块,执行
finally块中的代码,执行完finally块后的代码后,继续执行finally
块后面的代码,即没有异常,最终都会执行finally块,用户销毁申请
的内存空间.

异常的继承层次:

顶级类:Throwable
Trowable类有两个子类

Error类:不是程序员能使用的,一般情况下是jvm使用,虚拟机级别的错误(如内存溢出…)

比如:
要往u盘中写入一个文件,但没有u盘这个设备
异常错要抛给jvm来处理

Exception类:是程序员能够写代码处理的异常的根类分为两类别:

1.免检异常:不是必须添加try catch finally的

程序是能够编译和执行的,执行时触发的符合的异常程序还是意外终止
RuntimeException 运行时异常
ArithmethicException 算术异常
NullPointerException 空指针异常
ArrayIndexOutofBoundsException 数组下标越界异常
NumberFormatException 数字格式异常
InputMismatchException 输入不匹配异常
…等

2.必检异常:必须添加try catch finally,如果不添加,
则会会有红波浪线提示,说明程序时不能编译和执行
Exception 所有程序员能处理的异常的根类
SQlException sql异常
ClassNotFoundException 类没有发现异常
FileNotFoundException 文件没有发现异常
…等

如何判断异常时是免检还是必检?

  • 如果程序员在写代码的时候,代码没有错误,但报了红波浪线,并提示"Unhandled exception type XXXException"(无法处理 异常 类型 具体的异常类型)
    只要提示这句话,那么就属于必检异常
    必检异常必须添加try catch.否则红波浪线不会消失
    快捷键 alt+shift+z 来调用代码块的模板

    在这里插入图片描述

throw:

在java中,有一个Exception类,这个类有很多的子类, 每个子类都对应一种异常类型,这些异常类型都是java类库自带的的异常类型

比如:
NullPointerException
ArrayIndexOutofBoundsException

类似这些异常都java的定义完的规则,触犯规则就抛异常,即,系统定义的规则,系统检测到就由系统抛出

java中不可能把所有项目中遇到的异常都事先写好异常类

由程序员根据实际业务需求来抛出异常

比如:
要求年龄在1到100岁之间,如果不在范围内就抛出相应的异常
程序员定规则,程序员用java代码检测,程序员抛出
实现的方式有两种
方式一:
用try catch finally throw
方式二:
用java的逻辑代码来处理

throws:

throws关键字放在方法声明的后面,可以写很多个异常类型
之间用逗号间隔,表名此方法体可能会抛出的异常,这些异常
不在当前的方法体中用try catch finally处理,谁调用此方法
谁就用try catch finally来处理

注意:Exception类型必须放在throws后所有异常类型的后面

throws 的应用场景:一般情况下,写类库的时候,类库是提供给
其他项目使用的,类中的方法如果有异常,就适合用throws抛出
然后谁调用方法,谁就用try catch来处理,

自定义异常:

程序员自己创建的java类,但是必须继承自Exception及其子类中的任何类都可以,那么此类就是自定义异常类
自定义异常类,是作为本项目的异常类型补充

 /**
 * 自定异常类 AgeException
 * @author zhangyang
 *
 */
public class AgeException extends Exception {
	public AgeException(){
		super("年龄不对");
	}
	public AgeException(String message){
		super(message);
	}
	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return "年龄不合法";
	}
}
import org.junit.Test;
public class Demo {
	/**
	 * throw 和 throws用法
	 */
	private void setAge(int age)throws AgeException{
		if(age>=1 && age<=100){
			this.age=age;
		}else{
			//非要抛必检异常
			throw new AgeException("年龄范围不对");
		}
	}
	@Test  //Junit4测试框架
	public void testMethod(){
		try {
			setAge2(10000);
		} catch (Exception e) {
			// TODO Auto-generated catch block
        
		}
	}
}

在这里插入图片描述

应用场景:

java不可能把所有的项目中出现的异常,都事先准备好,所以,程序员根据需求自定义异常类,在自定义的异常类,提供异常错误信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值