# Java异常处理
## 1.错误和异常
错误(Error):系统的问题,导致的程序错误。
异常(Exception): 由于用户输入的一些错误的数据,导致程序出现问题。
### 目标
1. 如何找到程序中出现的异常,修改代码
2. 如何解决异常,异常处理的方式
3. 如何自定义异常
### 异常的类结构图
## 异常的处理
1. 为什么处理异常?
如果异常不处理,程序不能正确的向后执行,也就是说,程序遇到异常后将终止
另外,异常的处理要给用户一些警示
2. 处理方式:
1. try-catch-finally语句进行处理
语法:
try{
//statement(语句)
}catch(Exception e){
//statement(语句)
}
解释:尝试在一块代码块中 捕获一个异常对象,在catch语句块中对异常对象做怎样的处理
执行过程:代码还是顺序执行,当在try中捕获到了一个异常后,try剩余的代码将不再执行,直接跳转到catch语句块执行代码,catch语句块的代码执行完毕后,try-catch语句执行结束
**一个try可以有多个catch,每个catch中的异常类型不同,捕获到的异常对象类型是那个catch中的类型,就像哪个catch跳转**
**如果一个try有多个catch,父类异常的catch放在子类异常catch的后面**
**try-catch-finally 或 try-finally**
**finally是try-catch语句中一定会被执行的代码,通常都是一些释放资源的代码**
```java
try {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
int j = scanner.nextInt();
System.out.println(i/j);
System.out.println("计算完成");
String str = "";
System.out.println(str.equals(null));
System.out.println("比较完成");
}catch(ArithmeticException e) {
System.out.println("ArithmeticException");
e.printStackTrace();
}catch(NullPointerException e) {
System.out.println("NullPointerException");
e.printStackTrace();
}catch(Exception e) {
}finally {
System.out.println("我一定会被执行!!");
}
System.out.println("计算全部完成");
```
2. throws方式:将异常抛给调用者,抛出的异常通常都是受检查异常
throws语法:
写在方法的后面或构造器的后面,throws后面写抛出异常对象的类型
```java
public Date getDate(String date) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(date);
return d;
}
```
```java
public FileTools(String path)throws FileNotFoundException {
FileInputStream fis = new FileInputStream(path);
}
```
3. 异常的分类
1. 运行时异常(RuntimeException):是在运行期出现的异常,通常情况运行时异常不需要处理,程序员可以通过代码来避免运行时异常
2. 受检查异常(编译期异常):异常出现在编译期,如果不处理程序将无法编译。
常见的运行时异常:ArrayIndexOutOfBoundsException、NullPointerException、ArithmeticException、ClassCastException
```java
public void method(String str) {
if(str!=null)
System.out.println(str.equals(null));
}
public void method(int[] arr,int index) {
if(index<arr.length&&index>=0)
System.out.println(arr[index]);
}
public void method(Object obj) {
if(obj instanceof String) {
String s = (String)obj;
}
}
```
受检查异常识别:如果程序错误显示Unhandled exception type XxxxxException
4. 确定异常的位置
printStackTrace() : 打印异常的栈信息
找到你写的类的第一次出现的行号,结合这行的代码和报出的异常类分析代码错误
5. finally 和 final 和 finalize的区别
finally是try-catch-finally语句中一定会被执行的部分
final修饰类、属性、方法;修饰的类不能被继承;修饰的属性不能被修改;修饰的方法不能被重写
finalize是Object类的方法,当垃圾回收器要回收一个对象时,调用对象的finalize方法完成回收;程序员可以通过重写finalize方法完成在对象回收时执行的指定工作。
6. throw关键字:将异常对象抛到程序中,如果想主动的创建一个异常并抛到代码中,要使用throw关键字;而throws是将异常抛给调用者
7. 自定义异常类:JDK为我们提供了很多异常类,这些异常类都是大部分情况使用,但做项目时,可能会有邮件地址不存在异常,手机号码不正确异常,而这些异常是给程序员使用的
需求:编写一个底层类,类中包括一个发送邮件的方法,如果程序员在调用这个方法时邮件的地址不正确,则程序要抛出一个邮件地址不正确的异常(EmailURLNotFoundException)
1. 先定义一个类EmailURLNotFoundException继承Exception类,就是一个自定义的异常类
2. 封装一个发送邮件的方法,当邮件格式不正确时,throw 创建的邮件地址不正确的异常对象
3. 调用发送邮件的方法 try-catch
```java
public class EmailURLNotFoundException extends Exception{
public EmailURLNotFoundException(String message) {
super(message);
}
}
```
```java
public class EmailTools {
public static void send(String url,String title,String content) throws EmailURLNotFoundException {
if(url==null||"".equals(url)) {
throw new EmailURLNotFoundException("邮箱地址不正确");
}
System.out.println("发送了邮件。。。。");
//发送邮件的过程
}
}
```
```java
public class Main {
public static void main(String[] args) {
try {
EmailTools.send("", "aa", "abb");
} catch (EmailURLNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
**在方法中执行到throw 关键字时,方法就结束**
**eclipse的快捷操作**
1. 同时多行代码try-catch
2. 添加catch