• 欢迎光临~

异常相关

开发技术 开发技术 2022-12-01 次浏览

异常

异常体系结构

/*java.lang.Throwable
       |--- java.lang.Error:一般不编写针对性的代码进行处理。
       |--- java.lang.Exception:可以进行异常的处理 */

/*           |--- 编译时异常(checked)
               |--- IOException
                   |--- FileNotFoundException
               |--- ClassNotFoundException */
//           |--- 运行时异常(unchecked)
//               |--- NullPointerException
//               |--- ArrayIndexOutOfBoundsException
//               |--- ClassCaseException
//               |--- NumberFormatException
//               |--- InputMismatchException
//               |--- ArithmaticException
public class ExceptionTest {

   public static void main(String[] args) throws IOException {
       /* 以下是运行时异常*/
       // NullPointerException
//       int[] arr = null;
//       System.out.println(arr[1]);

//       String str = null;
//       System.out.println(str.charAt(0));

       // ArrayIndexOutOfBoundsException
//       int[] arr = new int[10];
//       System.out.println(arr[10]);

       // StringIndexOutOfBoundsException
//       String str = "abc";
//       System.out.println(str.charAt(3));

       // ClassCaseException
//       Object obj = new Date();
//       String str = (String) obj;

       // NumberFormatException
//       String str = "abc";
//       Integer num = Integer.parseInt(str);
//       System.out.println(num);

       // InputMismatchException 输入不匹配
//       Scanner scanner = new Scanner(System.in);
//       int score = scanner.nextInt();
//       System.out.println(score);
//       scanner.close();

       // ArithmeticException 算数异常
//       int a = 1;
//       int b = 0;
//       System.out.println(a / b);

       /* 以下是编译时异常*/
       /* FileNotFoundException*/
       File file = new File("hello.txt");
       FileInputStream fis = new FileInputStream(file);
       int data = fis.read();
       while(data != -1){
           System.out.print((char) data);
           data = fis.read();
      }
       fis.close();
  }
}

 

异常的处理

/*
一、异常的处理:抓抛模型

   过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码出生成一个对应异常类的对象。
                并将此对象抛出。
                一旦抛出对象以后,其后的代码就不再执行。

   过程二:“抓”:可以理解为异常的处理方式:① try - catch - finally     ② throws

   二、try - catch - finally的使用

   try{
       // 可能出现异常的代码
   }catch(异常类型1 变量名1){
       // 处理异常的方式1
   }catch(异常类型2 变量名2){
       // 处理异常的方式2
   }catch(异常类型3 变量名3){
       // 处理异常的方式3
   }
   ....
   finally{
       // 一定会执行的代码
   }

   说明:
   1. finally是可选的。
   2. 使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,
      就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
   3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。
      一旦处理完成,就跳出当前的try - catch结构(在没有写finally的情况)。继续执行其后的代码
   4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
      catch中的异常类型如果没有子父类关系,则要求子类一定声明在父类上面。否则,报错
   5. 常用的异常对象对立方式:① String getMessage(); ② printStackTrace();(常用)
   6. 在try结构中声明的变量,在出了try结构以后,就不能再被调用
   7. try - catch - finally 结构可以嵌套
   体会1:使用try - catch - finally处理编译时异常,是得程序在编译时就不再报错,但是运行时
         仍可能报错。相当于我们使用 try - catch - finally将一个编译时可能出现的异常,延迟
         到运行时出现。
   体会2:开发中,由于运行时异常比较常见,所以
         我们通常就不针对运行时异常编写try - catch - finally 了。
         针对于编译时异常,我们一定要考虑异常的处理。
*/          

 

public class ExceptionTest1 {
   public static void main(String[] args) throws FileNotFoundException {
/*       String str = "123";
       str = "abc";
       int num = 0;
       try {
           num = Integer.parseInt(str);
           System.out.println("hello -------------1");
       } catch (NullPointerException e) {
           System.out.println("出现空指针异常,不要着急....");
       } catch (NumberFormatException e) {
//           System.out.println("出现数值转换异常,不要着急....");
           // String getMessage();
           System.out.println(e.getMessage());
           System.out.println("----------------------");
           // printStackTrace();
           e.printStackTrace();
       }
       System.out.println(num);
       System.out.println("hello -------------2");
*/


/*       try {
           File file = new File("hello.txt");
           FileInputStream fis = new FileInputStream(file);
           int data = fis.read();
           while(data != -1){
               System.out.print((char) data);
               data = fis.read();
           }
           fis.close();
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e){
           e.printStackTrace();
       }

*/
  }
}

 

/*
   try - catch -finally 中 finally的使用;

   1. finally是可选的
   2. finally中声明的是一定会被执行的代码。即使
       ① catch中又出现异常了
       ② try中由return语句
       ③ catch中有return语句
     等情况。
   3. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动
      进行资源的释放。此时的资源释放,就需要声明在finally中。

*/

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FinallyTest {
   public static void main(String[] args) {
/*       try {
           int a = 10;
           int b = 0;
           System.out.println(a / b);
       } catch (ArithmeticException e) {
//           e.printStackTrace();
           int[] arr = new int[10];
           System.out.println(arr[10]);
       } catch (Exception e){
           e.printStackTrace();
       }
//       System.out.println("帅!");
       finally {
           System.out.println("我好帅啊");
       }

*/
/*     int num = method();
       System.out.println(num);

*/
       FileInputStream fis = null;
       try {
           File file = new File("hello.txt");
           fis = new FileInputStream(file);
           int data = fis.read();
           while(data != -1){
               System.out.print((char) data);
               data = fis.read();
          }
      } catch (FileNotFoundException e){
         e.printStackTrace();
      } catch(IOException e) {
           e.printStackTrace();
      } finally {
           try {
               if(fis != null)
               fis.close();
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }

/*   public static int method(){
       try {
           int[] arr = new int[10];
           System.out.println(arr[10]);
           return 1;
       } catch (ArrayIndexOutOfBoundsException e) {
           e.printStackTrace();
           return 2;
       } finally {
           System.out.println("我一定会被执行");
       }
   }
*/
}

 

 

package com.guigu.day16.exception2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*
   异常处理的方式二:throws + 异常类型

   1. "throws + 异常类型"写在方法的声明处。指明方法执行时,可能会抛出的异常类型。
      一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足
      throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

   2. 体会:try - catch - finally :真正的将异常处理掉了。
           throws的方式只是将异常抛给了方法的调用者。并没有真正将异常处理掉。

   3. 开发中如何选择使用 try - catch - finally 还是使用throws?
       3.1 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,
           意味着如果子类重写的方法中有异常,必须使用 try - catch - finally方式处理。
       3.2 执行的方法中,先后又调用了另外的几个方法,这几个方法是递进关系执行的,
           我们建议这几个方法使用throws的方式进行处理。而执行的方法a
           可以考虑使用 try - catch - finally 方式进行处理。
*/
public class ExceptionTest2 {

   public static void main(String[] args) {
       try {
           method2();
      } catch (FileNotFoundException e) {
           e.printStackTrace();
      }catch (IOException e) {
           e.printStackTrace();
      }

       method3();
  }

   public static void method3(){
       try {
           method2();
      } catch (IOException e) {
           e.printStackTrace();
      }
  }
   public static void method2() throws IOException{
       method1();
  }

   public static void method1() throws FileNotFoundException,IOException{
       File file = new File("hello.txt");
       FileInputStream fis = new FileInputStream(file);
       int data = fis.read();
       while (data != -1){
           System.out.println((char)data);
           data = fis.read();
      }
       fis.close();
  }
}

 

 

手动抛出异常

package com.guigu.day16.java2;

public class StudentTest {
   public static void main(String[] args) {
       try {
           Student s = new Student();
           s.regist(-1001);
           System.out.println(s);
      } catch (Exception e) {
           System.out.println(e.getMessage());
      }
  }
}

class Student{
   private int id;

   @Override
   public String toString() {
       return "Student{" +
               "id=" + id +
               '}';
  }

   public void regist(int id) throws Exception {
       if(id > 0){
           this.id = id;
      }else{
//           System.out.println("您输入的数据非法!");
           // 手动抛出异常对象
//           throw new RuntimeException("您输入的数据非法");
           throw new Exception("您输入的数据非法!");
           //throw new MyException("不能输入负数");
      }


  }
}

 

package com.guigu.day16.java2;

/*
如何自定义异常类?
1. 继承于现有的异常结构:RuntimeException、Exception
2. 提供全局常量:serialVersionUID
3. 提供重载的构造器
*/
public class MyException extends RuntimeException{

static final long serialVersionUID = - 7034897190745766939L;

public MyException(){

}

public MyException(String msg){
super(msg);
}
}
 
程序员灯塔
转载请注明原文链接:异常相关
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com