java9 - 异常处理
Java异常
1、异常初见
System.out.println(1/0);
运行上面语句之后打印出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
程序运行之后,在控制台会打印一串信息;这段信息,在Java中叫做异常。
2、什么是异常?
Java程序中异常:程序在运行过程产生的不正常情况;
编译没有问题,到运行的时候,出现错误. 这种现象叫异常。
3、常见异常
1.java.lang.NullPointerException
int a [] = null;
System.out.println(a.length);
2.java.lang.ArrayIndexOutOfBoundsException
int a [] = {};
a[0] = 10;
4、异常体系
ArithmeticException,
NullPointerException,
ArrayIndexOutOfBoundsException,
从上面的3个异常可以看出,在Java中使用不同的类来描述不同的异常。
从图中可以看出:
1、Throwable:Java语言中所有错误或异常的超类;
2、下面有两个子类,一个 Error(错误),一个Exception(异常)
4.1 Error 和 Exception的区别是什么?
其实这两个泛指都是异常.
Throwable
|---- Error 系统程序中,不能处理的错误,比如内存溢出.
|---- Exception 可以进行处理的.
5、异常处理
如果我们想让 System.out.println(1/0); 执行,该怎么办?
try {
System.out.println(1/0);
} catch (Exception e) {
System.out.println("异常所属类:" + e.getClass()); //获取抛出的异常类的类名
System.out.println("异常的原因:" + e.getMessage()); //获取具体的异常原因
}
5.1 能不能同时捕获到多个异常?
6、finally 语句
语法结构:
try{
可能出现异常的代码
}catch(异常类型 e){
处理异常:
1 打印到控制台
2 保存到文件
3 还可能向外抛出新的异常
}finally{
}
注意:finally后面没有小括号;
6.1 finaly 单词什么含义,表示最终的意思,那里面做什么事情?
1.关闭流资源(IO流部分讲解)或者 释放锁--线程(以后课程学习)
简单说明一下: 这里的流,类似于水流的意思,比如一个水龙头打开,流出水,突然发生地震了(产生异常),没有关闭水龙头,那水就一直流着,然后可能导致短路,电路中断,然后就可能引起火灾;所以希望中途不管发生什么异常情况,最终都应该关闭水龙头。这样就可以把关闭的代码写在finally里面;
2.释放锁 比如上厕所需要上锁,然后完事了之后,最后在开锁出来。
特点:如果在finally前面没有执行系统退出(system.exit(0))的语句,此处的代码始终都会执行。
3.不建议此处放return语句来返回一个数据(让程序难以理解,并且这里也不应该放return)
对于上面的结构,也有变种,比如:
try{
}finally{
}
只有try-finally,没有catch,这种结构在讲线程,释放锁学习
7、异常 throw 与 throws
练习:计算两个整数相除。
8、自定义异常
在Java异常体系已经包含了很多异常类,但是还是不能满足开发的日常情况那应该怎么办?
如何自定义异常?
场景:
1。假设用户注册过程中,发现用户名重复了,把这种情况定义为异常类型;
2。设计一个用户注册的方法,方法里面判断用户注册的用户名是否重复,如果重复,就产生一个异常对象;
3。调用注册方法来注册一个账号,就会产生一个异常。产生异常之后,就选择是抛出还是处理.
1.定义一个异常类(用户名重复异常)
package com.rimi.exception;
public class NameRepeatException extends Exception {
public NameRepeatException(){
super();
}
public NameRepeatException(String msg){
super(msg);
}
}
2.写个测试类
package com.rimi.exception;
public class Test {
public static void main(String[] args) {
String[] names = { "张三", "李四", "王二", "麻子", };
try {
login("张三", names);
} catch (Exception e) {
// TODO: handle exception
System.out.println("异常抛出:" + e.getMessage());
}
}
public static void login(String name, String[] names) throws NameRepeatException {
for (String string : names) {
if (string.equals(name)) {
throw new NameRepeatException("名字重复了");
}
}
}
}
作者:markbin
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.