Object类与异常

Object类与异常

1.Object类概述

	Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。所有类在创建对象的时候,最终找的父类就是Object。

1.2 equals方法

equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是==比较运算符。

在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。如下代码演示:

/*
	描述人这个类,并定义功能根据年龄判断是否是同龄人
	由于要根据指定类的属性进行比较,这时只要覆盖Object中的equals方法
	在方法体中根据类的属性值进行比较
 */
class Person extends Object{
	int age ;
	//复写父类的equals方法,实现自己的比较方式
	public boolean equals(Object obj) {
		//判断当前调用equals方法的对象和传递进来的对象是否是同一个
		if(this == obj){
			return true;
		}
		//判断传递进来的对象是否是Person类型
		if(!(obj instanceof Person)){
			return false;
		}
		//将obj向下转型为Perosn引用,访问其属性
		Person p = (Person)obj;
		return this.age == p.age;
	}
}

*注意*:在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。

1.3 toString 方法

toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

class Person extends Object{
	int age ;
	//根据Person类的属性重写toString方法
	public String toString() {
		return "Person [age=" + age + "]";
	}
}

注意:在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法. toString()方法在eclipse里也有快捷键生成.

2.异常

2.1异常概念

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

2.2 异常分类

**异常的根类是Throwable,其下有两个子类:Error与Exception,**平常所说的异常指Exception。

l 严重错误Error,无法通过处理的错误

l 编译时异常Exception,编译时无法编译通过。如日期格式化异常

l 运行时异常RuntimeException,是Exception的子类,运行时可能会报错,可以不处理。如数学异常

2.3 异常基本操作

创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)
抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)
处理异常:
		捕获处理,将异常获取,使用try/catch做分支处理
			try{
				需要检测的异常;
	}  catch(异常对象) {
		异常处理代码
		可以调用异常的方法
		通常我们只使用一个方法:printStackTrace打印异常信息
	}
		声明抛出处理,出现异常后不处理,声明抛出给调用者处理。
			方法声明上加throws  异常类名

注意:异常处理,指处理的一种可能性,即有了异常处理的代码,不一定会产生异常。如果没有产生异常,则代码正常执行,如果产生了异常,则中断当前执行代码,执行异常处理代码。

2.4 异常的产生过程解析

先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生的过程。

l 工具类

class ArrayTools{
//对给定的数组通过给定的角标获取元素。
public static int getElement(int[] arr,int index)	{
	    int element = arr[index];
	    return element;
}
}

测试类

class ExceptionDemo2 {
	public static void main(String[] args) 	{
		int[] arr = {34,12,67};
		int num = ArrayTools.getElement(arr,4)
		System.out.println("num="+num);
		System.out.println("over");
	}
}

图解分析:

在这里插入图片描述

2.4.1 捕获异常try**…catch…**finally

捕获异常格式:

try {
	//需要被检测的语句。
}
catch(异常类 变量) { //参数。
	//异常的处理语句。
}
finally {
	//一定会被执行的语句。
}

**try:**该代码块中编写可能产生异常的代码。

**catch:**用来进行某种异常的捕获,实现对捕获到的异常进行处理。

**finally:**有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

2.4.2 抛出异常throw

使用格式:

throw new 异常类名(参数);
2.4.3 声明异常throws

​ 声明异常格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2{   }

2.5 异常注意事项

l 多异常处理

捕获处理:

1多个异常分别处理

​ 2多个异常一次捕获多次处理

​ 3多个异常一次捕获一次处理

声明抛出异常:

​ 声明上使用,一次声明多个异常

l 运行时异常被抛出可以不处理。即不捕获也不声明抛出

l 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集

l 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出

l 当多异常处理时,捕获处理,前边的类不能是后边类的父类

l 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。

方法中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了

代码演示:

void show(){ //不用throws 
	try{
		throw new Exception();//产生异常,直接捕获处理
	}catch(Exception e){
//处理方式	
	}
}

l *一个try 多个catch组合* : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

void show(){ //不用throws 
	try{
		throw new Exception();//产生异常,直接捕获处理
	}catch(XxxException e){
//处理方式	
	}catch(YyyException e){
//处理方式	
	}catch(ZzzException e){
//处理方式	
	}
}

l *try finally 组合*: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

void show(){//需要throws 
	try{
	    throw new Exception();
	}finally {
		//释放资源
	}
}

3.自定义异常

通过阅读异常源代码:发现java中所有的异常类,都是继承Throwable,或者继承Throwable的子类。这样该异常才可以被throw抛出。

说明这个异常体系具备一个特有的特性:可抛性:即可以被throw关键字操作。

并且查阅异常子类源码,发现每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。

例如NullPointerException异常类源代码:

public 	class NullPointerException extends RuntimeException {
public NullPointerException() {
super();//调用父类构造方法
    }
public NullPointerException(String s) {
super(s);//调用父类具有异常信息的构造方法
    }
}

格式:

Class 异常名 extends Exception{ //或继承RuntimeException
	public 异常名(){
}
	public 异常名(String s){ 
super(s); 
}
}

terException() {
super();//调用父类构造方法
}
public NullPointerException(String s) {
super(s);//调用父类具有异常信息的构造方法
}
}


**格式:**

```java
Class 异常名 extends Exception{ //或继承RuntimeException
	public 异常名(){
}
	public 异常名(String s){ 
super(s); 
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐_僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值