Object类-try-catch-finally-throw-throws-自定义异常
Posted 胡广勤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Object类-try-catch-finally-throw-throws-自定义异常的主要内容,如果未能解决你的问题,请参考以下文章
异常概念和处理机制,try-catch-finally,throw和throws,自定义异常
异常概念和处理机制,try-catch-finally,throw和throws,自定义异常
try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?