Java:异常的处理
异常分两种大的异常类型,运行时异常和受检查异常。
用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白。
1、运行时异常
运行时异常的特点时java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即时没有有try---catch语句捕获它,也没有使用throws语句抛出它,还是会编译通过。
2、受检查异常
除了运行异常外,其他异常都属于受检查异常,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。
3、两者的区别
运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误的操作。一旦出现错误,建议让程序终止。
受检查异常表示程序可以处理的异常。如果抛出异常的方法本身不处理或者不能处理它,那么方法的调用者就必须去处理该异常,否则调用会出错,连编译也无法通过。当然,这两种异常都是可以通过程序来捕获并处理的。
对于运行异常,建议不要用try...catch...捕获处理,应该在程序开发调试的过程中尽量的避免,当然有一些必须要处理的,自己知道了那个部分会出现异常,而这种异常你要把它处理的你想要的结果,例如:空值处理。
异常的处理方式有三种:(1)用户完全自己处理、(2)抛给主方法,主方法再抛给虚拟机处理、(3)先抛出来,用户再自己处理
使用系统异常举例如下:
第一种处理方式(用户自己检测、捕获、处理):
class ExceptionDemo
{
public int method(int a,int b)
{
return a/b;
}
}
class ExceptionDemoTest
{
public static void main(String[] args)
{
ExceptionDemo ed = new ExceptionDemo();
try
{
int x = ed.method(,);
System.out.println("x = "+x);
}
catch (Exception e)
{
System.out.println(e.toString()); //输出异常的类的对象
System.out.println("除零了");
}
finally
{
System.out.println("over");
}
}
}
第二种处理方式(用户的功能方法抛出异常,交给主方法抛出异常,最后由虚拟机JVM进行处理):
class ExceptionDemo
{
public int method(int a,int b) throws Exception
{
return a/b;
}
}
class ExceptionDemoTest
{
public static void main(String[] args) throws Exception
{
ExceptionDemo ed = new ExceptionDemo();
ed.method(,);
System.out.println("over");
}
}
第三种处理方式(用户的功能方法抛出异常,接着由用户自己检测、捕获、处理):
class ExceptionDemo
{
public int method(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException
{
int[] array = new int[a];
System.out.println(array[]);
return a/b;
}
}
class ExceptionDemoTest
{
public static void main(String[] args)
{
ExceptionDemo ed = new ExceptionDemo();
try
{
//int x = ed.method(4,0); //所传两个数据均发生了异常,即数组下标越界异常和除数为0异常,但这两个
//异常不能同时检测到,因为检测时有循序,但第一个检测到处理完时即停止 // int x = ed.method(4,1); //检测到数组越界异常
int x = ed.method(,); //检测到除0异常
System.out.println("x = "+x);
}
catch (ArithmeticException e)
{
System.out.println("异常的数据信息为"+e.getMessage());
System.out.println(e.toString()); //输出异常的类的对象
System.out.println("除零了");
//e.printStackTrace(); //其实它是虚拟机的处理机制
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("异常的数据信息为"+e.getMessage());
System.out.println(e.toString()); //输出异常的类的对象
System.out.println("数组角标越界异常");
//e.printStackTrace(); //其实它是虚拟机的处理机制
}
catch(Exception e) //这个是上面的子类异常的父类异常,多用于处理不在具体的异常之外的异常
{
System.out.println(e.toString()); //输出异常的类的对象
}
finally
{
System.out.println("over");
}
}
}
使用系统异常类Exception的子类来自定义异常
具体举例如下:
例子1:
需求:人为自定义异常(除数不能为负数)
//继承Exception的异常类
class FuShuException extends Exception
{
/* private String msg;
FuShuException(String msg)
{
this.msg = msg;
}
public String getMessage() //输出异常信息
{
return msg;
}
*/ private int vaule;
FuShuException(String msg,int vaule)
{
super(msg); //父类throwable已经完成了异常的处理,子类直接可以调用,所以上面的异常初始化方法不用再写
this.vaule = vaule;
}
public int getVaule()
{
return vaule;
}
}
//异常类
class ExceptionDemo
{
public int method(int a,int b) throws FuShuException
{
if(b<)
throw new FuShuException("出现了除数是负数的情况:/by fushu",b); //通过手动throw抛出自定义异常对象
return a/b;
}
}
//主方法测试
class ExceptionDemoTest
{
public static void main(String[] args)
{
ExceptionDemo ed = new ExceptionDemo();
try
{
int x = ed.method(,-);
System.out.println("x = "+x);
}
catch (FuShuException e)
{
System.out.println(e.toString()); //输出自定义异常类,自动去调用前面的get Message();
System.out.println("错误的负数是:"+e.getVaule());
//System.out.println("除数为负数了");
}
finally
{
System.out.println("over");
}
}
}
例子2:
异常的举例描述:老师用电脑讲课
(封装成对象)异常类:
1、电脑蓝屏(BuleScreenException),抛出后老师可以捕获解决。
2、电脑冒烟(SystemSmokingException),抛出后老师解决不了,可以转换为课程进度异常抛出,老师可以捕获解决 即产生第三个异常类NoPlanExecption
提炼需求类:
1、老师:成员变量(name)、成员方法(lecture)
2、电脑:成员方法(run、reset)
//继承Exception的电脑蓝屏异常类
class BlueScreenException extends Exception
{
private String message;
public BlueScreenException(String message)
{
super(message);
}
}
//继承Exeption的系统冒烟异常类
class SystemSmokingException extends Exception
{
private String message;
public SystemSmokingException(String message)
{
super(message);
}
}
//继承Exception的转换异常类
class NoPlanExecption extends Exception
{
private String message;
public NoPlanExecption(String message)
{
super(message);
}
}
//定义一个老师类
class Teacher
{
private String name;
private Computer c;
public Teacher(String name)
{
this.name = name;
c = new Computer(); //设置电脑目前的状态(1或2或3)
}
void lecture() throws NoPlanExecption
{
try
{
c.run();
}
catch (BlueScreenException e)
{
System.out.println(e.toString());
c.reset();
}
catch(SystemSmokingException e)
{
test();
throw new NoPlanExecption("讲课不能继续,"+e.getMessage()); //冒烟异常老师解决不了,转换为课程进度异常抛出
}
System.out.println(name+"讲课");
}
public void test()
{
System.out.println("学生自己做练习");
}
}
//定义一个电脑类
class Computer
{
private int state; //电脑状态:数字1代表正常运行、数字2代表蓝屏、数字3代表冒烟
public Computer(int state)
{
this.state = state;
}
void run() throws BlueScreenException,SystemSmokingException
{
if(state==)
throw new BlueScreenException("电脑蓝屏了"); else if(state==)
throw new SystemSmokingException("电脑冒烟了"); System.out.println("电脑运行");
}
public void reset()
{
state = ; //重新将电脑状态设置成数字1
System.out.println("电脑重新启动");
}
}
//测试类
class CustomizeExceptionDemo
{
public static void main(String[] args)
{
Teacher t = new Teacher("毕老师");
try
{
t.lecture();
}
catch (NoPlanExecption e)
{
System.out.println(e.toString());
System.out.println("换老师或放假");
}
}
}
Java:异常的处理的更多相关文章
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
- Java异常之自定义异常
哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...
- 第11章 Java异常与异常处理
1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...
- java 异常
1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return 和 throw的区别 return 符合函数要求的值 throw 有问题的时候用它结束 ...
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- 2.Java异常学习
1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...
- java异常架构图 和几个面试题
1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...
- 黑马----JAVA异常
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...
随机推荐
- Teamwork——Week4 团队分工和预估项目时间
由于我们给每个组员预估的每天用在该团队项目的时间为2h左右,因此我们的时间计算也已2h为基数.下面就是我们的团队分工和预估项目时间. 任务编号 实现人员 任务详细描述 预估时间 任务0 全体组员 看学 ...
- Web前端技能
入门必备的技能: 第1项技能:HTML超文本标记语言: 技能要点: HTML文件的结构 HTML文件的编写方法 HTML基本标记 文字与段落标记 框架 使用表单 ...
- python 交换变量值
在其他语言中,交换两个变量值的时候,可以这样写: temp = a a = b b = temp 在Python中,我们可以简单的这样写: a,b=b,a 实验如下: >>> a=1 ...
- 深入理解jQuery中live与bind方法的区别
本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...
- hdu 3157 Crazy Circuits 网络流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3157 You’ve just built a circuit board for your new r ...
- 全面认识JVM技术
本文向大家描述一下JVM的概念,JVM(Java虚拟机)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行. J ...
- Codeforces Round #283 (Div. 2)
A:暴力弄就好,怎么方便怎么来. B:我们知道最多加10次, 然后每次加1后我们求能移动的最小值,大概O(N)的效率. #include<bits/stdc++.h> using name ...
- 纯CSS3实现3D动画导航,html5 webRTC技术实现免费网页电话拨打
花了一周的时间完成了 说吧 (免费网页电话) 的前端开发工作,先将技术点总结如下: 免费电话采用最新的html5 webRTC 技术 实现互联网和电信MIS网互通实现网页电话,目前只有 google ...
- 索引服务混战ASP.NET――微软的又一个隔离墩
话说月初笔者在华山之巅搞定了ASP.NET一起莫名奇妙的异常,自此之后和公主过着…嘟--,不好意思,书都看杂了,串了台了.好,咱们闲言少叙,书归正传. 自从上次解决了由调试文件库引起的ASP.NET执 ...
- 提高Python运行效率的六个窍门
曾灵敏 - MAY 18, 2015 Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作.不仅如此,它还轻松支持多任务处理,比如多进程. 不喜欢Python的人经常会吐嘈P ...