Java核心技术(初阶)知识点复习——[10]Java异常和异常处理

1.异常与异常处理的概念

  [1]程序不正常的行为或者状态称为异常;常见的包括数学上的错误(如5/0)、空指针、数组越界访问、读取不存在的文件等;

  [2]Java的异常处理机制使得程序返回到安全状态,即1)允许用户保存当前运行结果;

                          2)抓住异常,分析异常内容;

                          3)并以适当的方式安全的关闭程序(如,弹出错误警告而不是直接死机);

2.异常分类

 

 

 

[1]Throwable是所有类的祖先;

 Error系统内部错误或资源耗尽,不管它;

 Exception是程序有关异常,重点关注,

  1) 又分为RuntimeException是程序运行时自身的错误(1.2.):为编译器不辅助检查的Unchecked Exception,即不强制要求必须出现处理此类Exception的代码;

  2) IOException程序运行时外界的错误(3.4.):为编译器辅助检查的Checked Exception,即编译器强制要求程序中有处理此类的代码;

 

3.Java异常处理机制*2

  [1]try+catch/finally结构:

   try{}内:正常业务逻辑代码;

   catch{}内:当try{}内发生异常时,执行catch{}内代码,若整个运行期间都无异常,绕开(相当于没有何时类型的实参传入形参);

        进入一个catch{}后,不会再返回到try{}内发生异常的位置,即try{}内发生异常位置之后的代码都不会被执行;

        一个异常只能进入一个catch{}内,即进入一个catch{}后,后续的catch{}都不会执行,直接跳到finally{};

        因此,当用多个catch{}时,一场子类必须写在它们任何父类之前,否则,这个语句块永远不会使用,编译会报错;

   finally{}内:当try{}/catch{}执行结束后,必须要执行finally{}中的最终处理代码;

  [2]throws关键字重新抛出异常:

   某方法可能出现异常语句,但不在此处处理,即添加“try+catch/finally结构”,而是用throws关键字来声明异常;

   调用带有throws异常(checked exception)的方法,必须出现以下两种语句之一:1)通过try+catch/finally结构处理这些异常;

                                        2)再次throws这些异常,直到main函数为止;

 

 1 public class IntegerReader{
 2     private static BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
 3     private static PrintWriter stdErr = new PrintWriter(System.err, true);
 4     private static PrintWriter stdOut = new PrintWriter(System.out, true);
 5 
 6     public static void main (String[] args){
 7         stdOut.println("The value is:" + readInteger());
 8     }
 9 
10     public static int readInteger() throws IOException, NemberFormatException{
11         stdErr.print("Enter an integer >");
12         stdErr.flush();
13         return Integer.parseInt(stdIn.readLine());
14     }
15 }

 

4.自定义异常

  [1]必须继承自Exception类或其子类:

   继承自Exception,就是一个Checked Exception;

   继承自RuntimeException,就是一个Unchecked Exception;

  [2]自定义重点在构造函数:

   调用父类Exception的message构造函数;

   可以自定义自己的成员变量;

 1 public class DevideByMinusException extends Exception{
 2     int divisor;
 3     public DivideByMinusException(String msg, int divisor)
 4     {
 5         super(msg);//1.调用父类msg构造函数
 6         this.divisor = divisor;
 7     }
 8     public int getDevisor()
 9     {
10         return this.getDevisor();
11     }
12 }

 注1.:必须重写的构造方法为以下四种之一

  [1]Exception()
    构造zd详细消息为 null 的新异常。
  [2]Exception(String message)
    构造带指定详细消息的新异常。
  [3]Exception(String message, Throwable cause)
    构造带指定详细消息和原因的新异常。
  [4]Exception(Throwable cause)
    根据回指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包答含 cause 的类和详细消息)

 1 public class Student{
 2     public int divide(int x, int y)
 3     {
 4         return x/y;//2.编译通过,因为被除数异常属于Unchecked Exception,可以对比4.更深刻理解这个Unchecked Exception是有多么的Unchecked
 5     }
 6     public static void main(String[] args) throws DivideByMinusException{
 7         Student newton = new Student();
 8         newton.divide5(5, -2);
 9     }
10 
11     public int divide2(int x, int y)
12     {
13         int result;
14         try
15         {
16             result = x/y;
17         }
18         catch(ArithmeticException e)
19         {
20             System.out.println(e.getMessage());
21          }
22         catch(Exception e)
23         {
24             e.printStackTrace();
25         }
26         return result;
27     }

 

 1 public int divide3(int x, int y)throws ArithmeticException
 2 {
 3     return x/y;
 4 }
 5 
 6 public int divide4(int x, int y)//3.尽管divide3声明throws了一个异常,但divide可以不用处理,因为是Unchecked Exception
 7 {
 8 //    try
 9 //   {
10 //        return divide3(x, y)
11 //    }
12 //    catch(ArithmeticException e)
13 //    {
14 //        e.printStackTrace();
15 //    }
16         return divide3(x, y)
17 }

 

 1 public int divide5(int x, int y)throws DivideByMinusException
 2 {
 3     try
 4     {
 5         if(y<0)
 6         {
 7             throw new DivideByException("The divisor is negative", y);
 8         }
 9         return divide3(x, y);
10     }
11     catch(ArithmeticException e)
12     {
13         e.printStackTrace();
14     }
15 }//4.如果此时divide4调用了divide5,则必须对他进行处理

 

  [3]必须且只能使用throw(注意和上面throws区分!!!)关键字“主动”抛出异常

   异常对象生成的方式为:1)由Java虚拟机在运行时系统生成;(Unchecked Exception)

              2)由Java类库中的某些类生成;(Checked Exception)

              3)自己生成的异常对象;(可以不是真的出现了异常,而只是抛出下看看……理解可能有问题,先一搁置)

注:throw抛出的异常必须时Throwable的子类,这里和[1]中的要求也契合;

 

posted @ 2020-04-19 23:02  小菜在路上  阅读(187)  评论(0编辑  收藏  举报