java之异常处理、异常分类、Throwable、自定义异常
参考http://how2j.cn/k/exception/exception-trycatch/336.html
异常处理
try catch
1.将可能抛出FileNotFoundException 文件不存在异常的代码放在try里
2.如果文件存在,就会顺序往下执行,并且不执行catch块中的代码
3. 如果文件不存在,try 里的代码会立即终止,程序流程会运行到对应的catch块中
4. e.printStackTrace(); 会打印出方法的调用痕迹,如此例,会打印出异常开始于TestException的第16行,这样就便于定位和分析到底哪里出了异常
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
}
catch(FileNotFoundException e){
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} }
}
使用异常的父类进行catch
FileNotFoundException是Exception的子类,使用Exception也可以catch住FileNotFoundException
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
} catch(Exception e){
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} }
}
多异常捕捉办法1
有的时候一段代码会抛出多种异常,比如
new FileInputStream(f);
Date d = sdf.parse("2016-06-03");
这段代码,会抛出 文件不存在异常 FileNotFoundException 和 解析异常ParseException
解决办法之一是分别进行catch
catch (FileNotFoundException e) {
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} catch (ParseException e) {
System.out.println("日期格式解析错误");
e.printStackTrace();
}
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class TestException { public static void main(String[] args) { File f = new File("d:/LOL.exe"); try {
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse("2016-06-03");
} catch (FileNotFoundException e) {
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} catch (ParseException e) {
System.out.println("日期格式解析错误");
e.printStackTrace();
}
}
}
多异常捕捉办法2
另一个种办法是把多个异常,放在一个catch里统一捕捉
catch (FileNotFoundException | ParseException e) {
这种方式从 JDK7开始支持,好处是捕捉的代码更紧凑,不足之处是,一旦发生异常,不能确定到底是哪种异常,需要通过instanceof 进行判断具体的异常类型
if (e instanceof FileNotFoundException)
System.out.println("d:/LOL.exe不存在");
if (e instanceof ParseException)
System.out.println("日期格式解析错误");
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class TestException { public static void main(String[] args) { File f = new File("d:/LOL.exe"); try {
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse("2016-06-03");
} catch (FileNotFoundException | ParseException e) {
if (e instanceof FileNotFoundException)
System.out.println("d:/LOL.exe不存在");
if (e instanceof ParseException)
System.out.println("日期格式解析错误"); e.printStackTrace();
} }
}
finally
无论是否出现异常,finally中的代码都会被执行
throws
考虑如下情况:
主方法调用method1
method1调用method2
method2中打开文件
method2中需要进行异常处理
但是method2不打算处理,而是把这个异常通过throws抛出去
那么method1就会接到该异常。 处理办法也是两种,要么是try catch处理掉,要么也是抛出去。
method1选择本地try catch住 一旦try catch住了,就相当于把这个异常消化掉了,主方法在调用method1的时候,就不需要进行异常处理了
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) {
method1(); } private static void method1() {
try {
method2();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } private static void method2() throws FileNotFoundException { File f = new File("d:/LOL.exe"); System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开"); }
}
throw和throws的区别
throws与throw这两个关键字接近,不过意义不一样,有如下区别:
1. throws 出现在方法声明上,而throw通常都出现在方法体内。
2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
练习-异常处理
假设有一个方法 public int method(), 会返回一个整数
在这个方法中有try catch 和 finally.
try 里返回 1
catch 里 返回 2
finally 里 返回3
那么,这个方法到底返回多少?
public static void main(String[] args) {
System.out.println(test());
} public static int test() {
try {
return ;
}catch (Exception e){
return ;
}finally {
return ;
}
}
方法返回值是:3
原因
遇到try时,运行代码,执行里面的代码,包括return的代码;
由于finally肯定执行,执行finally代码,返回return 3 结束。
异常分类
异常分类: 可查异常,运行时异常和错误3种
其中,运行时异常和错误又叫非可查异常
可查异常
可查异常: CheckedException
可查异常即必须进行处理的异常,要么try catch住,要么往外抛,谁调用,谁处理,比如 FileNotFoundException
如果不处理,编译器,就不让你通过
package exception; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
}
catch(FileNotFoundException e){
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} }
}
运行时异常
运行时异常RuntimeException指: 不是必须进行try catch的异常
常见运行时异常:
除数不能为0异常:ArithmeticException
下标越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
在编写代码的时候,依然可以使用try catch throws进行处理,与可查异常不同之处在于,即便不进行try catch,也不会有编译错误
Java之所以会设计运行时异常的原因之一,是因为下标越界,空指针这些运行时异常太过于普遍,如果都需要进行捕捉,代码的可读性就会变得很糟糕。
package exception; public class TestException { public static void main(String[] args) { //任何除数不能为0:ArithmeticException
int k = /; //下标越界异常:ArrayIndexOutOfBoundsException
int j[] = new int[];
j[] = ; //空指针异常:NullPointerException
String str = null;
str.length();
}
}
错误
错误Error,指的是系统级别的异常,通常是内存用光了
在默认设置下,一般java程序启动的时候,最大可以使用16m的内存
如例不停的给StringBuffer追加字符,很快就把内存使用光了。抛出OutOfMemoryError
与运行时异常一样,错误也是不要求强制捕捉的
package exception; public class TestException { public static void main(String[] args) { StringBuffer sb =new StringBuffer(); for (int i = ; i < Integer.MAX_VALUE; i++) {
sb.append('a');
} } }
三种分类
总体上异常分三类:
1. 错误
2. 运行时异常
3. 可查异常
练习-异常分类
运行时异常 RuntimeException,能否被捕捉?
错误Error,能否被捕捉?
面试题常问题:运行时异常与非运行时异常的区别
面试题常问题:运行时异常与非运行时异常的区别:
运行时异常是不可查异常,不需要进行显式的捕捉
非运行时异常是可查异常,必须进行显式的捕捉,或者抛出
不要答成:
运行时异常是运行的时候抛出的异常,非运行时异常,不运行也能抛出
package exception; public class TestException { public static void main(String[] args) { String str = null; try {
str.toString();
} catch (NullPointerException e) {
System.out.println("捕捉到运行时异常: NullPointerException ");
} StringBuffer sb = new StringBuffer("");
try {
for (int i = ; i < ; i++) {
sb.append(sb.toString());
}
} catch (OutOfMemoryError e) {
System.out.println("捕捉到内存用光错误: OutOfMemoryError");
} }
}
Throwable
Throwable
Throwable是类,Exception和Error都继承了该类
所以在捕捉的时候,也可以使用Throwable进行捕捉
如图: 异常分Error和Exception
Exception里又分运行时异常和可查异常。
package exception; import java.io.File;
import java.io.FileInputStream; public class TestException { public static void main(String[] args) { File f = new File("d:/LOL.exe"); try {
new FileInputStream(f);
//使用Throwable进行异常捕捉
} catch (Throwable t) {
// TODO Auto-generated catch block
t.printStackTrace();
} }
}
练习-Throwable
在方法声明上,可以抛出指定的异常,比如FileNotFoundException
那么能否抛出Throwable这个类?
这个方法的调用者又该如何处理?
答案:可以抛出
public class TestException {
public static void main(String[] args) {
method1();
} public static void method1() {
try{
method2();
}
catch(Throwable t) {
System.out.println("系统打开失败");
t.printStackTrace();
}
} public static void method2() throws Throwable{
File f = new File("d:/LOL.exe"); System.out.println("系统先尝试打开");
new FileInputStream(f);
System.out.println("系统打开成功");
}
}
注意:将Throwable 换成Exception就不行了,原因是:比如,它万一抛出来一个error,你让人家怎么捕获?前面类型转换的内容,这里将子类转父类,是不一定行的,相反的父类转子类是可行的。
自定义异常
创建自定义异常
一个英雄攻击另一个英雄的时候,如果发现另一个英雄已经挂了,就会抛出EnemyHeroIsDeadException
创建一个类EnemyHeroIsDeadException,并继承Exception
提供两个构造方法
1. 无参的构造方法
2. 带参的构造方法,并调用父类的对应的构造方法
class EnemyHeroIsDeadException extends Exception{ public EnemyHeroIsDeadException(){ }
public EnemyHeroIsDeadException(String msg){
super(msg);
}
}
抛出自定义异常
在Hero的attack方法中,当发现敌方英雄的血量为0的时候,抛出该异常
1. 创建一个EnemyHeroIsDeadException实例
2. 通过throw 抛出该异常
3. 当前方法通过 throws 抛出该异常
在外部调用attack方法的时候,就需要进行捕捉,并且捕捉的时候,可以通过e.getMessage() 获取当时出错的具体原因
package charactor; public class Hero {
public String name;
protected float hp; public void attackHero(Hero h) throws EnemyHeroIsDeadException{
if(h.hp == ){
throw new EnemyHeroIsDeadException(h.name + " 已经挂了,不需要施放技能" );
}
} public String toString(){
return name;
} class EnemyHeroIsDeadException extends Exception{ public EnemyHeroIsDeadException(){ }
public EnemyHeroIsDeadException(String msg){
super(msg);
}
} public static void main(String[] args) { Hero garen = new Hero();
garen.name = "盖伦";
garen.hp = ; Hero teemo = new Hero();
teemo.name = "提莫";
teemo.hp = ; try {
garen.attackHero(teemo); } catch (EnemyHeroIsDeadException e) {
// TODO Auto-generated catch block
System.out.println("异常的具体原因:"+e.getMessage());
e.printStackTrace();
} }
}
练习-自定义异常
java之异常处理、异常分类、Throwable、自定义异常的更多相关文章
- Java自学-异常处理 异常分类
Java 中异常的分类 异常分类: 可查异常,运行时异常和错误3种 其中,运行时异常和错误又叫非可查异常 步骤 1 : 可查异常 可查异常: CheckedException 可查异常即必须进行处理的 ...
- JAVA笔记9__异常/throw关键字/自定义异常/受检与非受检异常、assert关键字/StringBuffer、StringBuilder/代码国际化、动态文本
/** * 异常:在程序中导致程序中断运行的一些指令 * 1.受检异常:编译期 * 2.非受检异常:运行期 * 异常处理过程分析: * 1.一旦产生异常,系统会自动产生一个异常类的实例化对象 * 2. ...
- Java中异常分类和Throw和Throws的区别
Java中异常分类和Throw和Throws的区别 1.异常分类 Throwable是Java中所有错误和异常的超类.它的下一级是Error和Exception 1.1 Error(错误) Error ...
- Java基础笔记-异常
Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...
- Java基础之异常
1.异常的概念 异常:程序在运行时出现的不正常情况,也可以说是出现的问题: Java中的异常:出现的不正常的问题也是一类事物,这类事物有一些共性的东西,比如有名称,有产生的原因等,将这些共性的部分抽取 ...
- -1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常
异常 异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象. 其实就是Java对不正常情况进行描述 ...
- Java 面向对象 异常处理:RunTimeexception,try-catch,异常声明throws,自定义异常,throw和throws的区别,多异常处理(9)
Java 面向对象 异常处理:RunTimeexception,try-catch,异常声明throws,自定义异常,throw和throws的区别,多异常处理(9)
- 点评阿里JAVA手册之异常日志(异常处理 日志规约 )
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...
- Java异常分类 转载
Java异常分类 http://blog.csdn.net/woshixuye/article/details/8230407 一.基本概念 看java的异常结构图 Throwable是所有异 ...
随机推荐
- C#操作XML方法:新增、修改和删除节点与属性
一 前言 先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...
- 【C#图解】PictureBox.SizeMode 属性(转)
PictureBoxSizeMode.Normal: 默认情况下,在 Normal 模式中,Image 置于 PictureBox 的左上角,凡是因过大而不适合 PictureBox 的任何图像部分都 ...
- ios导航栏问题
http://m.blog.csdn.net/article/details?id=47395605
- Raspberry Pi3 ~ 使用eclipse进行远程调试
为了开发方便需要在电脑上对树莓派进行远程Debug. l 在eclipse中安装交叉编译(参照开发环境搭建) arm-linux-gnueabihf-gcc l 树莓派中检查是否安装了gdb ...
- POJ - 2251 Dungeon Master 【BFS】
题目链接 http://poj.org/problem?id=2251 题意 给出一个三维地图 给出一个起点 和 一个终点 '#' 表示 墙 走不通 '.' 表示 路 可以走通 求 从起点到终点的 最 ...
- spring-boot5
Spring Boot集成MyBatis: (1)新建maven project;取名为:spring-boot-mybatis (2)在pom.xml文件中引入相关依赖: (3)创建启动类App.j ...
- logback 配置详解(下)
logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...
- JS高级调试技巧:捕获和分析 JavaScript Error详解
前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常 ...
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- python_opencv库的学习
一.以灰度图的形式加载彩色图像. https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_ ...