Object-异常声明及捕获-自定义异常

一.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);
    }

对于原始方法来说比较的是两个对象的地址.

代码:

//覆写toString()
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("name:").append(this.name).append("\t").append("age:").append(this.age);
return sb.toString();
} 
@Override
public boolean equals(Object obj){
//首先判断地址值,地址值相等则一定是同一对象
if(this == obj){
return true;
}
//然后判断是否是同一类,若不是同一类,则必定不相等
if(!(obj instanceof Person)){
return false;
}
//如果是同一类,则比较其属性,属性相同,则为同一事物
Person p = (Person) obj;
if(this.name == p.name && this.age == p.age){
return true;
}else{
return false;
}
}
}
public class PersonDemo{
public static void main(String[] args){
Person p = new Person("zhangsan",20);
Person p1 = new Person("zhangsan",20);
Person p2 = new Person("zhangsan1",20);
System.out.println(p);
System.out.println(p.equals(p1));
System.out.println(p.equals(p2));
}
}

二.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 异常类名(参数);

代码:

class ArrayTools{
public static int getElement(int[] arr, int index){
if(arr == null){
throw new NullPointerException("arr指向的数组不存在");
}
if(index < 0 || index >= arr.length){
throw new ArrayIndexOutOfBoundsException("错误的角标"+index+"索引在数组中不存在");
}
int element = arr[index];
return element;
}
}
public class ExceptionDemo{
public static void main(String[] args){
int[] arr = {1,2,3};
//int num = ArrayTools.getElement(null,2);//ExceptionDemo.java:21
int num1 = ArrayTools.getElement(arr,5);//ExceptionDemo.java:22
//System.out.println("num="+num);
System.out.println("num1="+num1);
}
}

控制台显示:

[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

代码:

//import java.io.*;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionTest{
public static void main(String[] args) throws FileNotFoundException,IOException{
FileReader fr = new FileReader("a.txt");//ExceptionTest.java:8
int c = fr.read();
System.out.println(c);
}
}

控制台显示:

[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{

绝对执行的代码块;

(一般用来释放资源)

}

代码:
import java.io.IOException;
import java.io.FileReader;
public class TryTest{
public static void main(String[] args){
FileReader fr = null;
try{
int c = fr.read();  //TryTest.java:8
System.out.println(c);
}catch(IOException e){
System.out.println("读取文件时出现了异常");
}finally{
if(fr != null){
try{
fr.close();
}catch(IOException e){
System.out.println("关闭流时出现了问题");
}
}
}
}
}

控制台显示:

[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.在自定义的类里添加构造方法,在构造方法调用父类的构造方法.

//自定义异常举例

class NoAgeException extends Exception{
NoAgeException(){
super();
}
NoAgeException(String message){
super();
}
}
class Person{
private String name;
private int age;
Person(String  name, int age) throws NoAgeException{
if(age <  0 || age > 200){
throw new NoAgeException("年龄数值非法");
}
this.name = name;
this.age = age;
}
public String toString(){
return "name="+name+"age="+age;
}
}
public class ExceptionDemoTest{
public static void main(String[] args){
try{
Person p  = new Person("xiaoming", 20);
System.out.println(p);
}catch(NoAgeException ex){
System.out.println("年龄异常");
}
System.out.println("over");
}
}
时间: 2024-10-13 22:45:45

Object-异常声明及捕获-自定义异常的相关文章

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间过得很快,转眼一个月就这样过去了,我们不多说,继续我们的JAVA之旅 一.异常的概述 异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法 //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无返回值 main方

“全栈2019”Java异常第二十章:自定义异常详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异常第二十章:自定义异常详解 下一章 "全栈2019"Java异常第二十一章:finally不被执行的情况 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

java 第48节 Java中的异常声明

2016-06-30 1 异常声明 一个方法不处理它所产生的异常,而是调用层次向上传递, 谁调用这个方法,谁来处理. package com.java1995; /** * 异常的声明:throws * @author Administrator * */ public class Test { public static void main(String[] args) { System.out.println("main方法开始执行"); Test t=new Test(); //

转 C#WinForm程序异常退出的捕获、继续执行与自动重启

特别声明:本文是转载的,在这里向原作者表示深深的感谢!解决我们的一个大问题! 本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 int a = 0; int c = 10 / a; 将会导致程序自动结束,而且没有任何提示信息 但是如果是在主线程里运行这个代码,是会弹出异常信息对话框的 请问如何在线程里也出现这个异常信息对话框.或者避免程序直接退出,忽略异常,继续往下执行呢? 在WINFORM主线程捕获全部异

java中的异常抛出以及自定义异常

throw throws 声明将要抛出何种类型的异常(声明) public void 方法名(参数列表) throws 异常列表{ //调用会抛出异常的方法或者: throw new Exception(); } class 自定义异常类 extends异常类型{ }

python 异常继承关系及自定义异常的实现

主要介绍 python 中异常的继承关系,及如何自定义异常 1. 异常的继承关系 BaseException # 所有异常的基类 +-- SystemExit # 解释器请求退出 +-- KeyboardInterrupt 用户中断执行(通常是输入^C) +-- GeneratorExit # 生成器(generator)发生异常来通知退出 +-- Exception # 常规异常的基类 +-- StopIteration # 迭代器没有更多的值 +-- StandardError # 标准错误

[Java开发之路](20)try-with-resource 异常声明

Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 在java7以前,程序中使用的资源需要被明确地关闭,过程有点繁琐,如下所示: package com.qunar.lectures.tryResource; import java.io.*; import java.util.ArrayList; import java.util.List; /** * Created by xiaosi on 16-3-4. *

C# 中异常抛出捕获机制--throw / try,catch,finally

try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { messagebox.show("finally"); } notes:      抛出异常用 throw new exception,捕获异常用 try..catch..finally try ... catch 的目的是解决程序在出现错误时无法继续执行下去的问题. try不一定只能和ca

SSM-SpringMVC-26:SpringMVC异常骇级之自定义异常注解版

 ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解的方法实现异常解析,话不多说,直接搞起,和以前一样的习惯,和上篇博客一样的代码放后面,不一样的在前面 案例: 1.自定义处理器和处理方法 package cn.dawn.day18annotationexception; import cn.dawn.day18annotationexception.userexception.UserageException; import cn.dawn.day1