学习笔记之Java笔记
Posted 可持续化发展
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记之Java笔记相关的知识,希望对你有一定的参考价值。
目录
异常
概述
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抛出的是一个异常实例,不是异常类,而且每次只抛出一个异常实例。
如果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、深拷贝和浅拷贝区别是什么?
引用拷贝:创建一个指向对象的引用变量的拷贝。多了一个引用变量,指向同一个对象。
对象拷贝:创建对象本身的一个副本。创建了新的对象。
深拷贝和浅拷贝都是对象拷贝。
浅拷贝:对象的浅拷贝仅仅对“主”对象进行拷贝,但不会复制主对象所引用的对象。
深拷贝:把要复制的对象连同所引用的对象都复制了一遍。
以上是关于学习笔记之Java笔记的主要内容,如果未能解决你的问题,请参考以下文章