Java之初学异常
异常
学习异常的笔记记录
异常
异常的概念
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.
异常的体系
简单划分下 :
Throwable : java语言中所有异常和错误的超类
|-- Exception : 编译期异常(日期格式化,日期解析,需要try-catch/throws抛出)
|--RuntimeException : 运行期异常(数组越界异常)
|--Error : 错误(数组创建长度过大)
异常(Exception)的分类
- 编译期异常 :在编译时期就要处理(IO流的文件不存在,日期解析格式化),不处理便已不能通过
- 运行期异常 : 在运行时出现的异常(/by zero,索引越界等等)
举个例子(异常是怎么产生的和产生后如何处理) :
异常的处理
throw 关键字:
- 作用 : 可以使用throw关键字在指定的方法中抛出异常
- 使用格式 : throw new xxxException("异常产生的原因"");
1.throw new 必须写在方法的内部
2.throw new 后面的对象必须是Exception类或者是Exception的子类对象
3.throw抛出RuntimeException或者它的子类,可以不处理,交给JVM处理.
抛出编译异常,就必须处理该异常,try{}catch{}或者throws
throws 关键字:
作用 : 当方法内部抛出异常对象的时候,处理时可以使用throws抛出给调用者,让调用者处理.
使用格式 : 在方法声明时在最后使用throws抛出
修饰符 返回值类型 方法名(参数列表) throws xxxException{}
1.throws关键字必须写在方法声明处
2.throws关键字后边声明的异常必须是Exception或者是他的子类
3.方法内部如果抛出多个异常,throws也必须写多个异常,存在父子关系的,可以直接写父类,如果都写子类必须在父类的前面
4.调用方法处理时,可以继续使用throws,也可以try{}catch{}
throw与throws的区别 :
- 位置不同,前者方法中,后者方法声明处
- 含义不同,前者制造异常,后者是处理异常
- 格式不同,throw + 异常对象,throws + 异常名称(多个异常,使用逗号隔开就好)
try..catch..:
格式 :
try{
可能出现问题的代码
}catch(异常类型 变量名){ // 声明异常变量
处理异常的代码 // 尽量不要只用printStackTrace() 处理
}
执行流程 : try内代码出现异常,catch会捕获异常(使用catch中的类型进行匹配,匹配成功之后就会执行catch内的代码
如果匹配失败,则继续向上抛出,交给调用者去处理,最后都没有处理时会交给JVM进行处理),try出现异常的地方后面的代码
停止执行,执行catch内的代码,如果try内没有出现异常代码正确执行,不会执行catch的代码.
try...catch..finally :
当程序出现一种需求,无论程序是否出现异常,都需要执行某个代码块(比如流的关闭,sql连接关闭等等),这个时候就需要finally了
格式 :
try{
可能出现异常的代码
} catch(异常类型 变量名){
异常处理
} finally{
无论是否出现异常都需要执行的代码
}
执行流程 : 在try..catch的基础上,catch执行完毕或者JVM处理完异常之后,执行finally代码块,除非使用System.exit(0)强行停止代码.
不要再finally中使用return语句,虽然语法上无错误,但尽量避免,finally语句一般用于回收资源,
如果在try或catch中进行一个返回值.这个时候这个返回通道的值已经确定,在finally语句中修改值,这个
时候返回值并不会被修改.
举个例子,用来说明上面那个返回通道的问题:
Throwable类定义了处理异常的三个方法:
- public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
- public String toString() :获取异常的类型和异常描述信息(不用)。
- public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台。
多个异常如何处理:
- 多次捕获,多次处理(也就是每个可能出现异常的代码都使用一个try..catch进行捕获处理)
- 一次捕获,多次处理(也就是一个try,多个catch,注意的是catch中有子父类关系,子类异常必须在父类异常的前面)
- 一次捕获,一次处理(也就是catch中使用具有较高父类的Exception对象)(建议使用)
举个例子:
public class TryCatchDemo {
public static void main(String[] args) {
// 多个异常多个处理
try {
// 产生空指针异常(创建对象赋值为null,使用对象调用方法可以产生空指针异常)
Integer integer = null;
System.out.println(integer.toString());
} catch (NullPointerException e) {
e.printStackTrace();
}
// 出现的顺序很奇怪,正好体现的是多线程
try {
// 产生字符串越界异常,访问字符串的索引查过字符串的长度就可以产生
String s = "dilireba";
for(int i = 0; i <= s.length(); i++){
System.out.println(s.charAt(i));
}
} catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
}
// 多个异常一次捕获,多次处理
try {
// 产生空指针异常(创建对象赋值为null,使用对象调用方法可以产生空指针异常)
Integer integer = null;
System.out.println(integer.toString());
// 产生字符串越界异常,访问字符串的索引查过字符串的长度就可以产生
String s = "dilireba";
for(int i = 0; i <= s.length(); i++){
System.out.println(s.charAt(i));
}
// 会出现NullPointerException,因为第一次异常之后后面的代码停止执行
} catch (NullPointerException e) {
e.printStackTrace();
}catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
}
// 多个异常一次捕获,一次处理,建议使用这种
try {
// 产生空指针异常(创建对象赋值为null,使用对象调用方法可以产生空指针异常)
Integer integer = null;
System.out.println(integer.toString());
// 产生字符串越界异常,访问字符串的索引查过字符串的长度就可以产生
String s = "dilireba";
for(int i = 0; i <= s.length(); i++){
System.out.println(s.charAt(i));
}
} catch (Exception e) { // 实际上是使用了多态
// 会出现NullPointerException,因为第一次异常之后后面的代码停止执行
e.printStackTrace();
}
}
}
异常的注意事项:
1.如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
2.父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不
能声明抛出3.运行时异常被抛出可以不处理。即不捕获也不声明抛出。
4.在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
5.如果finally有return语句,永远返回finally中的结果,避免该情况.
自定义异常
Java提供的异常类,有时候对于我们来说不够用,做不到见名知意,这个时候需要自定义异常类
格式 :
public class XXXException extends Exception | RuntimeException{
添加一个空参数构造方法
添加一个带异常信息的构造方法
}
注意 :
1.自定义异常一般都是以Exception结尾的,说明该类是一个异常类
2.自定义异常类,必须继承Exception或者是RuntimeException,前者用于自定义编译期异常,后者用于自定义运行期异常(可以不处理,交给JVM处理).如下所示,自定义异常类:
/**
* 自定义异常类,在进行开发的时候一定要做到见名知意
*
* @author WZLOVE
* @create 2018-07-16 15:53
*/
public class MyException extends Exception{ // 自定义编译期异常类,继承Exception类,重写两个构造方法 public MyException() {
} public MyException(String message) {
super(message);
}
}
可以尝试着自己写一个注册的异常类,尝试一下.
Java之初学异常的更多相关文章
- Java面向对象之异常详解
目录 Java面向对象之异常[一] Java面向对象之异常[二] 捕获异常的规则 访问异常信息 异常对方法重写的影响 finally详解 Java面向对象之异常[一] Java面向对象之异常[二] 往 ...
- Core Java 总结(异常类问题)
所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...
- 关于java中的异常问题 1
1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...
- Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch
今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...
- Java throw:异常的抛出怎么回事
到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下: throw ThrowableInstance;这里,Thr ...
- [改善Java代码] 提倡异常的封装
JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性 ...
- java学习一目了然——异常必知
java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...
随机推荐
- FM在特征组合中的应用
原文来自:博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun 特征组合 x1年龄 x2北京 x3上海 x4深圳 x5男 x6女 用户1 ...
- Netty源码分析第4章(pipeline)---->第1节: pipeline的创建
Netty源码分析第四章: pipeline 概述: pipeline, 顾名思义, 就是管道的意思, 在netty中, 事件在pipeline中传输, 用户可以中断事件, 添加自己的事件处理逻辑, ...
- 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...
- Python发送邮件(最全)
简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件. Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听 ...
- Java调用XML的方法:DocumentBuilderFactory
(1)首先得到:得到 DOM 解析器的工厂实例 DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); (2)然后从 D ...
- [linux] LVM原磁盘扩容(非增加磁盘)
阿里云机器,ECS运行时磁盘由300G扩容到500,重启机器生效后登录.可以看到/data目录总大小300G,/dev/vdb已经扩容到500G. [root@HD1g-elasticsearch2 ...
- H-ui框架制作选项卡
本案例运用H-ui框架,写了一个选项卡案例 1. html代码(固定这样写,用一个div包裹控制条tabBar和内容条tabCon) <div id="tab-index-carteg ...
- 软件共享平台的NABCD
Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...
- String 类 的 使用
package com.StringUse; import java.util.Arrays; /* String 的构造方法: String() 创建一个空内容 的字符串对象. String(byt ...
- 软工实践-Beta 冲刺 (6/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...