Error 和Exception的区别
ERROR:程序无法处理,出现时JVM会终止线程。
Exception:通常情况下是可以被程序所处理的,并且在程序中应该尽可能去处理这些异常。
异常指的是程序运行中出现的不期而至的各种状况如:
1.输入不符合要求
2.文件不存在或者格式不对
3.读取的数据库是空的
4.内部或者硬盘满了......等等
需要掌握的三种异常类型:
RuntimeException:编译通过,运行时才会被发现。
一般由程序员写代码时出现的逻辑错误引起的异常,在程序中可以选择捕获处理
I/O Exception (非运行时异常)
ERROR://错误不是异常(编译也能通过,不好预见)
ERROR通常由JAVA虚拟机生成并抛出
①Java虚拟机的堆溢出或者栈溢出时,将会出现OutOfMemoryError
②虚拟机执行应用时,类定义错误:NotClassDefFoundError、链接错误(LinkageError)
异常体系结构:
捕获异常和抛出异常:
五个关键词:try、catch、finally、throw、throws
try:
监控区域,里面放的是可能出错的(需要检查异常)的语句
catch:
①捕获异常,并在catch中写报错信息
e.printStackTrace();语句可以打印出错误的栈信息 ,也可以自己手动用S.out写报错内容。
不过一般处理异常时不会简单的打印出异常,而是在catch中增加代码处理异常
②catch中可以用System.exit(1);语句直接来结束程序
③catch语句可以写多个来捕获多个异常,但从上到下只能执行一条,所以写的时候范围由小到大
从具体的Exception——>Exception——>Throwable(最大的范围,包含所以异常和错误)
写反了会报错
finally:
用于处理善后工作,例如在IO流中关闭资源。
其中try和catch是必须要有的,finally可以不写
PS:无论异常是否被捕获,finally都会被执行
throw:(运行时异常)
主动的抛出异常,一般在方法中使用。
假设方法中处理不了这个异常。在方法中抛出异常,让调用该方法的对象来捕获异常。
程序本身就会报出异常的类型,用Throw可以选择 异常的类型。
抛出异常时程序就停止了,但是方法中的异常抛出可以在main函数中用try-catch函数接住,处理掉,这样就可以让程序不终止。
throws:
如果方法中的throw在方法中就被try-catch接收,则不需要用throws关键词
而在方法中的异常没有被try-catch接受,则需要在方法方法的声明处通过关键词 throws +要抛出的异常 来给到方法的调用者,然后在方法的调用者中被try-catch接收
用try-catch 捕获异常:
例①
除数为0时报出异常.ArithmeticException
快捷键:ctrl+alt+t
自定义异常:
步骤:
1.自定义异常类
用toString方法来异常打印信息!!!
2.在方法中通过throw关键词抛出异常对象
3.如果在当前抛出异常的方法中处理异常,则使用try-catch语句捕获并处理
否则在方法的声处通过throws关键词指明要抛出的异常给 方法调用者,继续进行下一步操作
此例中,用的是后者,即用了throws关键词,在方法的调用者中接收异常
4.在出现异常的方法调用者中捕获并处理异常:
a=11时的打印结果:
异常总结:
1.处理Runtime Exception主要靠逻辑去合理规避,同时辅助try-catch处理
2.多重catch块后,可以加一个catch(Exception)来处理可能会被遗漏的异常
3.尽量添加finally语句块去释放占用的资源IO、Scanner
4.尽量去处理异常,而不是简单地调用printStackTrace()去打印输出