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("名字重复了");
			}
		}
	}

}
posted @ 2017-03-29 20:34  磨刀石  阅读(409)  评论(1编辑  收藏  举报