zoukankan      html  css  js  c++  java
  • Object类-try-catch-finally-throw-throws-自定义异常

    一.Object类
         Object类是最顶端的类,其它类都是它的子类,它的方法可以被继承.如果定义的类没有继承别的类,那它的直接父类就是Object.如果方法参数类型为object类型,
    则调用方法可以传递任意类型的值(相当于多态);同理,如果方法返回值为Object类型,那么给方法的返回数据值为任意类型.
         两种常用方法:toString()/equals()
    (1)toString方法
    源码:
    public String toString(){
             return getClass().getName() + "@" + Integer.toHexString(hashCode());
         }
    覆写前直接打印对象p1,与p1.toString()打印的结果都是地址值,所以需要重写toString方法,使其能够输出所有成员变量的值.
    (2)equals方法
    源码:
    public boolean equals(Object obj) {
             return (this == obj);
         }
    对于原始方法来说比较的是两个对象的地址.

    代码:

      1 //覆写toString()
      2  class Person{
      3      private String name;
      4      private int age;
      5 
      6     public Person(String name, int age){
      7          this.name = name;
      8          this.age = age;
      9      }
     10 
     11     public String getName(){
     12          return this.name;
     13      }
     14 
     15     public int getAge(){
     16          return this.age;
     17      }
     18 
     19     @Override
     20      public String toString(){
     21         StringBuilder sb = new StringBuilder();
     22          sb.append("name:").append(this.name).append("	").append("age:").append(this.age);
     23          return sb.toString();
     24      }
     25 
     26     @Override
     27      public boolean equals(Object obj){
     28          //首先判断地址值,地址值相等则一定是同一对象
     29         if(this == obj){
     30              return true;
     31          }
     32 
     33         //然后判断是否是同一类,若不是同一类,则必定不相等
     34         if(!(obj instanceof Person)){
     35              return false;
     36          }
     37 
     38         //如果是同一类,则比较其属性,属性相同,则为同一事物
     39         Person p = (Person) obj;
     40          if(this.name == p.name && this.age == p.age){
     41              return true;
     42          }else{
     43              return false;
     44          }
     45 
     46      }
     47  }
     48 
     49 
     50  public class PersonDemo{
     51      public static void main(String[] args){
     52          Person p = new Person("zhangsan",20);
     53          Person p1 = new Person("zhangsan",20);
     54          Person p2 = new Person("zhangsan1",20);
     55          System.out.println(p);
     56          System.out.println(p.equals(p1));
     57          System.out.println(p.equals(p2));
     58      }
     59  }
     60 


    二.try--catch--finally
    (1)异常概念及种类
         异常是程序中出现的问题,可以把异常封装成java中的类.java中异常的根类是Throwable.下面分为两个子类:Error和Exception.
    Error:严重问题,需修改代码才能解决.一般指与虚拟机相关的问题,如系统崩溃/虚拟机错误/动态链接失败等
    Exception:一般问题,可能会出现.一旦出现简单处理即可(??).如IOException.一般说的异常指Exception,包括Checked异常和Runtime异常.
         目前遇到的异常有如下几种:
             NumberFormatException  数字格式化异常
             ArithmeticException 算术异常
             ArrayIndexOutOfBoundsException  数组超出绑定异常:没有输入参数,或输入的参数不够
             NullPointerException 空指针异常:使用了未实例化的对象
             NoSuchMethodError:main  找不到主方法
             ClassCastExeption:A 类转换异常
             IllegalThreadStateException:非法的线程状态异常
             IOException: IO流异常

    (2)异常的处理方式
         异常处理方式:捕获处理:try--catch--finally 和 声明抛出处理 throws

    (3)jvm处理异常的过程
         jvm处理异常的过程:
             1.程序出错,创建异常对象
             2.抛出异常
             3.处理异常:捕获处理和声明抛出处理

    (4)抛出异常-throw:
    throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行.
    格式: throw new 异常类名(参数);
    代码:

      1 class ArrayTools{
      2      public static int getElement(int[] arr, int index){
      3 
      4          if(arr == null){
      5              throw new NullPointerException("arr指向的数组不存在");
      6          }
      7 
      8         if(index < 0 || index >= arr.length){
      9              throw new ArrayIndexOutOfBoundsException("错误的角标"+index+"索引在数组中不存在");
     10          }
     11 
     12         int element = arr[index];
     13 
     14         return element;
     15      }
     16  }
     17 
     18 public class ExceptionDemo{
     19      public static void main(String[] args){
     20          int[] arr = {1,2,3};
     21          //int num = ArrayTools.getElement(null,2);//ExceptionDemo.java:21
     22          int num1 = ArrayTools.getElement(arr,5);//ExceptionDemo.java:22
     23          //System.out.println("num="+num);
     24          System.out.println("num1="+num1);
     25      }
     26  }
     27 


    控制台显示:
    [Exception in thread "main" java.lang.NullPointerException: arr指向的数组不存在
         at ArrayTools.getElement(ExceptionDemo.java:5)
         at ExceptionDemo.main(ExceptionDemo.java:21)]
    [Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 错误的角标5索引在数组中不存在
         at ArrayTools.getElement(ExceptionDemo.java:9)
         at ExceptionDemo.main(ExceptionDemo.java:22)]


    (5)声明异常(throws):定在方法声明的后面,告诉方法的调用者去处理异常,一般用于Checked异常
    如果方法内抛出了Checked异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理.
    格式: 修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2
    代码:

      1 //import java.io.*;
      2  import java.io.FileReader;
      3  import java.io.FileNotFoundException;
      4  import java.io.IOException;
      5 
      6 public class ExceptionTest{
      7      public static void main(String[] args) throws FileNotFoundException,IOException{
      8          FileReader fr = new FileReader("a.txt");//ExceptionTest.java:8
      9          int c = fr.read();
     10          System.out.println(c);
     11      }
     12  }
     13 


    控制台显示:
    [Exception in thread "main" java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)
         at java.io.FileInputStream.open0(Native Method)
         at java.io.FileInputStream.open(FileInputStream.java:195)
         at java.io.FileInputStream.<init>(FileInputStream.java:138)
         at java.io.FileInputStream.<init>(FileInputStream.java:93)
         at java.io.FileReader.<init>(FileReader.java:58)
         at ExceptionTest.main(ExceptionTest.java:8)]   

    (6)捕获异常:
         eclipse快捷键 alt shift z
    格式:
             try{
                 可能会出现异常的代码
             }catch(异常类名 异常对象名){
                 处理异常的代码一;
                 使用异常对象打印异常信息;
             }finally{
                 绝对执行的代码块;
                 (一般用来释放资源)
             }

    代码:

      1 import java.io.IOException;
      2  import java.io.FileReader;
      3 
      4 public class TryTest{
      5      public static void main(String[] args){
      6          FileReader fr = null;
      7          try{
      8          int c = fr.read();  //TryTest.java:8
      9          System.out.println(c);
     10          }catch(IOException e){
     11              System.out.println("读取文件时出现了异常");
     12          }finally{
     13              if(fr != null){
     14                  try{
     15                      fr.close();
     16                  }catch(IOException e){
     17                      System.out.println("关闭流时出现了问题");
     18                  }
     19              }
     20          }
     21 
     22     }
     23  }
     24 


    控制台显示:
    [Exception in thread "main" java.lang.NullPointerException
         at TryTest.main(TryTest.java:8)]

    (7)异常注意事项:
         1)try中创建的变量只能在try代码块中使用,出try后面的代码块即无效,局部变量.
         2)捕获代码后,finally花括号后的代码将继续执行.
         3)打印异常方法:e.printStackTrace().
         4)方法中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了.
         代码:


         5)一次捕获一次处理 catch大异常/一次捕获多次处理  多个catch/多次捕获多次处理 多个try-catch
         6)先处理小异常,再处理大异常
         7)除非在try或catch块中执行了退出虚拟机的方法(System.exit(1):非零为非正常退出),否则,无论try或catch中执行怎样的代码,finally中的语句一定会执行.
         8)关于return:
         当java程序执行到try/catch块中的return或throw语句时,会先去寻找finally块中是否也含有return或throw等结束方法的语句,如果有则执行finally
         块中的return或throw语句,并且终止方法,不再执行任何语句;
         如果finally块中没有结束方法的语句,刚程序返回try/catch块中执行其return等语句,并终止方法.


    三.自定义异常
         1.让自定义的类继承异常类(是Throwable或其子类)
             如果继承的父类是编译时异常,则抛出后需要调用方法处理.
             如果继承的父类是运行时异常,不需要处理
         2.在自定义的类里添加构造方法,在构造方法调用父类的构造方法.

    //自定义异常举例

      1 class NoAgeException extends Exception{
      2      NoAgeException(){
      3          super();
      4      }
      5 
      6     NoAgeException(String message){
      7          super();
      8      }
      9  }
     10 
     11 class Person{
     12      private String name;
     13      private int age;
     14 
     15     Person(String  name, int age) throws NoAgeException{
     16          if(age <  0 || age > 200){
     17              throw new NoAgeException("年龄数值非法");
     18          }
     19 
     20         this.name = name;
     21          this.age = age;
     22      }
     23 
     24     public String toString(){
     25          return "name="+name+"age="+age;
     26      }
     27  }
     28 
     29 public class ExceptionDemoTest{
     30      public static void main(String[] args){
     31          try{
     32              Person p  = new Person("xiaoming", 20);
     33              System.out.println(p);
     34          }catch(NoAgeException ex){
     35             System.out.println("年龄异常");
     36          }
     37          System.out.println("over");
     38      }
     39  }
     40 

  • 相关阅读:
    Docker容器监控(十)--技术流ken
    Docker跨主机通信(九)--技术流ken
    Docker多主机管理(八)--技术流ken
    Docker公共&本地镜像仓库(七)--技术流ken
    Docker镜像构建的两种方式(六)--技术流ken
    Docker网络(五)--技术流ken
    tomcat使用详解(week4_day2)--技术流ken
    haproxy使用演示--技术流ken
    xshell连接虚拟机详解--技术流ken
    grafana使用详解--技术流ken
  • 原文地址:https://www.cnblogs.com/huguangqin/p/7124047.html
Copyright © 2011-2022 走看看