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("\t").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 
时间: 2024-08-05 23:16:32

Object类-try-catch-finally-throw-throws-自定义异常的相关文章

Java基础(一)异常处理关键字:try catch finally throw throws

嗨咯,大家晚上好,我的博客首篇开始了 ,我们一起加油吧! 都说java 语言是非常健壮性 如:垃圾回收机制.内存模型.异常处理,强类型转换.跨平台,等等,使得Java语言的受到青睐.今天我们先来聊聊java的异常处理机制try catch finally throw throws,平时我们貌似小瞧了这五个关键字.开发应用系统,良好异常的处理对系统后期的开发.维护.升级.用户的体验尤其重要. 异常有个非常重要的特征,从出现异常的位置 到 最顶端的main方法 如果你一直没catch到它,最终jvm

浅谈Java throw, throws, try catch异常处理

1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.如下面例子所示: public class Shoot {   创建类 static void pop() throws NegativeArraySizeException { //定义方法并抛出NegativeArraySizeException异常 int [] arr = new int[-3];//创建数组 } public

-1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常

异常 异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象. 其实就是Java对不正常情况进行描述后的对象体现. Throwable |--Error        严重问题,我们不处理. |--Exception |--RuntimeException        运行期异常,我们需要修正代码 |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过 Exception和

5.27 java中try,catch,throw,throws,finally

http://blog.sina.com.cn/s/blog_4f1c99de0100tyty.html try{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理. 首先要清楚,如果没有try的话,出现异常会导致程序崩溃.而try则可以保证程序的正常运行下去. Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的:Throws:  Lists t

08. Object类、异常类

八.黑马程序员_Object类.异常类 A.Object类  B.异常类 A.Object类介绍 a.介绍 Object类是所有类的直接或间接父类,它里面定义的功能是所有类都具备的. b.Object类中常用的方法有 getClass():返回该对像的运行时类.它返回一个Class类型的对像.在反射中较常用: toString():返回该对像的字符串表现形式.返回值为String类型.通常我们都要覆写这个方法: hashCode():返回该对象的哈希码值.它返回一个int类型的值.通常情况下我们

黑马程序员-Java基础-面向对象—多态、Object类、内部类、异常

第一讲  多态 1.  定义 可以理解为事物存在的多种体现形态. 在java中,当函数的功能内容不确定时,可以将此方法定义为抽象方法,让其子类去实现.当子类对象不同时,调用同一个函数名,会执行不同的函数体,得到不同的结果,从而体现了多态性. 2.  多态的体现形式 父类的引用指向了自己的子类对象:Fu f = new Zi(): 父类的引用也可以接受自己的子类对象: 3.  多态的前提条件 必须是类与类之间有关系,要么继承,要么实现(接口): 函数之间存在覆盖(重写): 4.  多态的好处 大大

Object类和异常

Object类(所有类的顶级父类) 今天说的两个方法: equals: 用于比较两个对象是否相同,它其实是使用两个对象的内存地址进行比较,底层默认使用的是==比较运算符来判断的. 在以后开发中,要比较两个对象是否相同,经常会根据对象中的属性值进行比较.也就是经常需要重写Object类中的equals方法,根据对象的属性值进行比较         注意:在重写Object类中的equals方法时,一定要注意参数是Object类型,在调用对象的属性时,一定要进行类型转换,在转换之前一定要进行类型判断

Java知多少(75)Object类

Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 public class Demo{ 2 // ... 3 } 实际上是下面代码的简写形式: 1 public class Demo extends Object{ 2 // ... 3 } 在Java中,只有基本类型不是对象,例如数值.字符和布尔型的值都不是对象,所有的数组类型,不管是对象数组还

Object类源码解析

本文的分析基于JDK 1.8 Java中所有的类都继承自Object类. Object类的源码解析 1.void registerNatives() private static native void registerNatives(); static { registerNatives(); } 1 2 3 4 5 1 2 3 4 5 该方法只是对几个本地方法进行注册(即初始化java方法映射到C的方法).需要注意的是,很多类中都有这个方法,但是执行注册的目标是不同的.System类中也有该