学习笔记之Java笔记(二)

本文详细讲解了Java异常处理的基本规则,包括Checked与Runtime异常的区别,throw和throws的用法,以及如何使用克隆操作。特别强调了正确使用异常处理避免过度和不当使用,以及深浅拷贝的概念。
摘要由CSDN通过智能技术生成

目录

异常

概述

使用throws抛出异常

使用throw抛出异常

异常处理规则

1、throw 和 throws 的区别 ?

克隆


异常

概述

Java把所有的非正常情况分为:异常(Exception)和错误(Error)。它们都继承Throwable父类。

Error错误一般是指与JVM相关的问题,如系统崩溃、虚拟机错误等。这类错误无法捕捉或无法恢复,将导致程序中断。不应该用catch块来捕捉Error或throws抛出Error。

Java异常体系分为Checked异常和Runtime异常(运行时异常)。所有RuntimeException及其子类的实例都是Runtime异常,其余的异常实例都是Checked异常。Java认为Checked异常是可以被修复的异常。必须显示处理Checked异常,否则,无法通过编译。

Checked异常的优势是:能在编译时提醒程序员代码中可能存在的问题。

Runtime异常的优势是:用它,代码更加简洁。

一般推荐使用Runtime异常。

先抓小异常,再抓大异常。

常见的运行时异常有:

①IndexOutOfBoundsException:数组越界

②NumberFormatException:数字格式异常

③ArithmeticException:除0异常

异常类继承体系

使用finally回收资源

不管try块中是否有异常,不管哪一个catch块被执行,不管在try块或catch块中是否执行了return语句,finally块都会被执行。

异常处理语法结构中,只有try块是必需的,catch块和finally块是至少出现其中之一,也可都有。

++++++++++++++++++++++++++++++++++++++++++++++++

使用throws抛出异常

思路:当前方法不知道怎么处理这种类型的异常,该异常应该由上一级调用者处理。它是预计这个方法可能出现的异常。如果是main方法使用throws,该异常将交给JVM处理。JVM处理异常的方法是:打印异常的跟踪栈信息,并中止程序的运行。

语法:throws只能在方法名后面使用,可抛出多个异常,异常类名之间用逗号隔开。用了throws就不需要用try catch。调用一个throws checked异常的方法时,调用语句要么放在try块中,要么放在另一个用throws修饰的方法中。限制:子类throws出的异常类型应该是父类throws出的异常类型的子类或相同。

+++++++++++++++++++++++++++++++++++++++++++++++++

使用throw抛出异常

思路:当需要抛出那种由程序员决定抛出,但系统无法抛出的异常时,就用throw语句。throw语句允许程序主动抛出我们想抛出的异常。

语法:throw如果定义在方法体内,必须搭配 thy / catch 或者 throws 一起使用。throw抛出的是一个异常实例,不是异常类,而且每次只抛出一个异常实例。抛出这个异常实例是会跳出while循环的。

如果throw抛出Checked异常,则该throw语句要么处于try块里,要么处于throws修饰的方法中。如果throw抛出Runtime异常,则无须放在try块或throws修饰的方法中,我们既可以显示使用try…catch捕获并处理该异常,也可以完全不理会该异常。

=============================

用户自定义异常都应该继承Exception基类。

++++++++++++++++++++++++++++++++++++++++++++++++

异常处理规则

①不要过度使用异常。比如:使用异常处理来代替流程控制;用抛出异常来代替所有的错误处理。

②不要使用过于庞大的try块。

③避免使用Catch All语句。

④不要忽略捕捉到的异常。Catch块为空或仅仅打印出错误信息是不妥的。

=====================

1、throw 和 throws 的区别 ?

Java 中抛出异常有3种方式,分别是 throw , throws ,系统自动抛出。

系统自动抛出:

当开发人员自己编写代码出现异常(主义错误,逻辑错误,转义错误),该异常如果自己没捕捉,则系统会自动抛出 。

throw :

throw是当程序中某种逻辑错误时由开发人员主动抛出自己指定类型异常。创建的是一个异常对象,确定某种异常才能使用,定义在方法体内,必须搭配 thy / catch 或者 throws 一起使用。

throws :

在方法参数后(方法头的位置),throws 可以 跟着 多个异常名,多个抛出的异常用逗号隔开。表示在调用该方法的类中抛出异常(可以理解往上抛),不在该类中解决,预计这个方法可能出现的异常。

1)throws 用在方法声明后,跟在后面的是异常类名 (Execution ),throw 用在方法体内,跟的是异常的对象名 (new Execution)。

2)throws 后可以跟多个异常类名,用逗号隔开;而 throw 只能抛出一个异常对象名。

3)throws 表示抛出的异常由该方法调用者处理,throw表示抛出的异常由自己处理(定义方法体内)

4)throws 表示会出现异常的一种可能性,不一定会发生该异常;throw 要是执行了则一定抛出了某种异常且后面的代码都不执行。

克隆

1、为什么要使用克隆?

在Java语言中,我们说两个对象是否相等通常有两层含义:

①对象的内容是否相等,通常使用到对象equals(Object o)函数;

②引用的地址是否相同,使用运算符==比较即可。

当两个引用变量通过==赋值时,表明这两个引用指向了内存中同一个地址。有时候,我们需要从一个已经存在的对象重新拷贝一份出来,并且不仅这两个内容相等,在内存中存在两个独立的存储地址,互不影响,这时,就需要用到Java的克隆机制。

2、如何实现对象克隆?

有两种方式:

1). 实现Cloneable接口并重写Object类中的clone()方法;可以实现深克隆和浅克隆。

2). 实现Serializable接口,通过对象的序列化和反序列化可以实现深克隆,

3、深拷贝和浅拷贝区别是什么?

引用拷贝:创建一个指向对象的引用变量的拷贝。多了一个引用变量,指向同一个对象。

对象拷贝:创建对象本身的一个副本。创建了新的对象。

深拷贝和浅拷贝都是对象拷贝。

浅拷贝:对象的浅拷贝仅仅对“主”对象进行拷贝,但不会复制主对象所引用的对象。

深拷贝:把要复制的对象连同所引用的对象都复制了一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可持续化发展

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

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

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

打赏作者

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

抵扣说明:

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

余额充值