JAVAday22

# 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值