• java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)


    java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)

    作者:王可利(Star·星星)

    异常:(API 的 java.lang 有一个异常,有很多很多

        在Java程序中也会程序出现不正常的情况,这个就叫异常。

        Java是面向对象的语言,任何事物都可以用类来描述,同样的异常也是一种事物。Java中提供了很多的异常类。

        多个异常堆积起来,就是一个异常体系。

        Throwable:是异常类的父类,超类。Exception 异常、error错误。

    异常的体系如下(图解):

    主要学习Thorwable 的三个方法:

    1.toString();   对Thorwable 的简短描述:类完整的名称: 包名 + 类名

    2.getMessage();   Thorwable的详细信息的字符串

    3.printStackTrace();   打印的是异常的栈内存信息

    package study;
    
    public class star {
        public static void main(String[] args) {    
            
            Throwable t = new Throwable("这是一个异常,请处理");//这里是异常对象,所以异常//参数可以传一个getMessage进来
            System.out.println(t.toString());//java.lang.Throwable:这是一个异常,请处理
            System.out.println(t.getMessage());//这是一个异常,请处理
            t.printStackTrace();//打印的是异常的栈内存信息
        }
    }

    error 错误:错误一般是Java虚拟机或者硬件导致的问题,叫错误。所以我们一般不会用代码来处理错误。

    如:byte[] buf = new byte[1024*1024*1024];

    //语法没有错误,java虚拟机默认只能管理64M内存,所以是因为java或者硬件引发的问题我们叫错误

    异常Exception:所有的异常都 继承于 Exception。

    错误和异常的区别:

        如:java.lang.OutOfMemoryError 这个是错误的一种类型(以Error结尾的)

              AclNotFoundException 这个是一个异常(以Exception结尾,除了Error结尾的都是

    异常的处理:

        方式一:捕获异常

                   捕获异常的处理格式:

                   try{

                          可能发生异常的代码

                   }catch(捕获的异常的类型   变量名){

                           处理异常的代码

                   }

     1 package study;
     2 
     3 
     4 public class star {
     5     public static void main(String[] args) {    
     6         
     7         int[] arr = {1,2};
     8         arr= null;//java.lang.NullPointerException 空指针异常
     9         test(4, 0,arr);//java.lang.ArithmeticException: / by zero
    10     }
    11     public static void test(int a,int b,int[] arr){
    12         
    13         
    14         //捕获异常处理
    15         int c = 0;
    16         
    17         try {
    18             //可能出现异常的代码
    19             System.out.println(arr.length);
    20             c = a/b;            
    21         } catch (ArithmeticException e1) {
    22             System.out.println("处理除数为0的异常");
    23         } catch(NullPointerException e2){
    24             System.out.println("处理空制指针异常");
    25         } catch(Exception e){//这个父类的要放在最后面,如果放在最前面处理了异常了,后面的异常都不会执行了。这样这个可以处理上面没有的其他异常。
    26             System.out.println("所有的异常都在这里处理");
    27         } 
    28         
    29         System.out.print("c = "+c);
    30     }
    31 }

    捕获异常处理的注意点:

        1.如果try中的方法出了问题,处理之后会继续执行try-catch 以外的代码。

        2.catch里面的代码只会在 try中的代码出现异常了,才会执行。

        3.一个try中是可以用很多个catch块,也就是会说一个try可以处理很对个异常。

        4.try 捕获异常是从小到大的顺序来的捕获异常的。最下面的是父类最大的异常。否者就会报错。

    捕获异常的作用:

    目前还看不出,学习JavaEE的时候就经常用到(知识点后期补上);

    为什么不直接用最大的异常:

    为了让我们跟精确快速地找到错误的根源。如:空指针异常,用最大的异常的话,就看不出来是空指针异常。

        方式二:抛出异常

                      抛出异常处理关键的两个关键字(throw 、throws)

    throw 、throws使用注意点:

     1.throw 关键字用于方法里面,throws 用于方法声明上的。

     2.throw 关键字用于方法内部抛出异常,throws 用于方法声明上抛出异常。

     3.throw 关键字后面只能有一个异常,throws 可以声明多个异常。

    抛出异常的使用注意点:

     1.如果你在方法中抛出了一个异常对象,就必须在方法声明上一个异常的抛出。

     2.如果一个方法调用了抛出异常的方法,那么调用者就必须处理抛出的这个异常。

     3.如果一个方法中跑出了异常,那么throw后面的代码不会再被执行。

     4.在一种情况下只能抛出一种异常。(详见代码)如果是多个异常的话,就取离它最近的那个异常。

    什么时候抛异常,什么时候不抛异常?

    需要通知调用者(谁调用你的代码),你的代码可能存在问题,,这个时候就需要抛出这个异常,让调用者来解决处理。

    如果代码是直接和用户打交道的,这个时候遇到异常,就需要处理代码,用户不知道这个代码是什么意思,要换个方式让用户知道这个是什么。

     1 package study;
     2 
     3 
     4 public class star {
     5     public static void main(String[] args) {    
     6         try {
     7             int[] arr = {1,2};
     8             arr = null;
     9             test(4, 0,arr);
    10         } catch (ArithmeticException e) {
    11             System.out.println("正在处理异常");
    12         }
    13         
    14     }
    15     public static void test(int a ,int b,int[] arr) throws ArithmeticException,NullPointerException{//一定要声明这个异常
    16         //之前用try-catch 是用来处理异常,然后后面的代码继续执行
    17         //现在是把出现异常的代码抛出去,给调用者(这里的上一级在主函数里面)
    18         
    19         if (b == 0) {
    20             throw new ArithmeticException();//有可能有这个错误的对象,把它抛出去
    21         }/*else if (arr == null) {//如果上面执行了代码之后, throw后面的代码就不会再执行
    22             throw new NullPointerException();
    23         } */
    24         
    25           System.out.println("啦啦啦");
    26             int c = a/b;
    27         //System.out.println(c);//抛出去的话 c 就没有意义了,就不用打印
    28     }
    29 }

    自定义异常

        需求:模拟feiQ(飞秋)上线的时候,发现网线没有插,这个时候要自己抛出异常(提示程序员网线没有插);

    前提:自定义一个类继承于Exception

    问题:有时候抛出异常必须声明,有时候抛出异常不需要声明。

    异常体系结构:在 Exception 后面还分为 运行时异常 和 编译时异常;

    运行是异常:抛出运行时异常时,是可以不用在方法上声明异常的,调用者也可以不作处理。

    编译时异常:抛出编译时异常时,就必须在方法方法上声明异常,调用者也必须要处理一下。

    如何区分编译时和运行时异常:

    那些属于运行时异常:是RuntimeException 这个异常本身,或者继承于这个异常的子类都是运行时异常。

    除了运行时异常其他的都是编译时的异常。Exception 是编译时的异常。

     1 class NoIPException extends Exception{
     2     
     3     //自定义没插网线的异常
     4     public NoIPException(String message) {
     5         super(message);//如果不写默认调用父类的空的构造方法
     6     }
     7 }
     8 
     9 public class star {
    10     public static void main(String[] args) throws NoIPException{    
    11    
    12         //用feiQ
    13         String ip = "192.168.10.100";
    14         
    15         test(ip);//这里错误,两个选择,可以继续抛,可以处理掉。
    16         throw new NoIPException("没插好,网线请插好网线");//这里再抛出就是去到了java虚拟机了
    17     }
    18     public static void test(String ip) throws NoIPException{
    19         if (ip == null) {
    20             throw new NoIPException("没插好,网线请插好网线");//这里抛出了给调用者(主函数)
    21         }
    22     }
    23 }

    finally 关键字

    finally 块 和 try 是一起使用的。

    finally:无论出现什么问题,finally 中的代码都会执行,除非jvm退出了,代码才不会被执行。

    finally 的作用:finally 非常适合做资源释放的工作,这样做就可以保证我这资源文件在任何时候都可以释放。

     1 package study;
     2 
     3 public class star {
     4     public static void main(String[] args) {    
     5          try{
     6              
     7              test(10,0);
     8 
     9           }catch(Exception e) {
    10            
    11              System.out.println("正在处理....");
    12           }
    13     }
    14     public static void test (int a, int b) throws Exception{
    15         
    16         int c= 0;
    17         try
    18             {
    19                 c = a / b;
    20             }
    21             catch (Exception e)
    22             {
    23        
    24              // System.exit(0);//退出jvm
    25               return; //还是照样执行finally中的代码
    26             }
    27             finally {
    28               System.out.println("c = "+c);
    29             }
    30     }
    31 }
  • 相关阅读:
    CodeForces 58C Trees
    【转】二分匹配题集
    HDU2604 Queuing
    HDU1281 棋盘游戏
    HDU3360 National Treasures
    HDU2444 The Accomodation of Students
    HDU1498 50 years, 50 colors
    HDU1068 Girls and Boys
    【转】常用的latex宏包
    【转】网络流题集
  • 原文地址:https://www.cnblogs.com/StarKL/p/6137065.html
Copyright © 2020-2023  润新知