java-异常处理2
一 编译时异常和运行时异常的区别
java认为如果你的程序有问题,你应该让调用者知道.
例如:面包,长毛了.用户去买了,用户可能会挂 .应该在面包上贴上标签(异常).
java
如果在函数内抛出Exception//编译失败,因为编译器在检查语法时发生了错误。
该程序已经出现问题,Java认为这个程序本身存在隐患,
需要捕获或者声明出来(你要么把问题处理,要么把问题标识出来让调用知道)
1.1 抛RuntimeException不要捕获,不声明?
不是功能本身发生的异常,而是因为比如调用者传递参数错误而导致功能运行失败。(如数组下标越界)
这时也是问题,需要通过异常来体现,但是这个异常不要声明出来的。
声明的目的是为了让调用者进行处理。
不声明的目的是不让调用者进行处理,就是为了让程序停止,让调用者看到现象,并进行代码的修正。★★★★★
1.2异常分两种
1,编译时异常:编译器会检测的异常。
2,运行时异常:编译器不会检测的异常。不需要声明。声明也可以,如果声明了,无外乎就是让调用者给出处理方式。常见的异常
- ArrayIndexOutOfBoundsException
- IllegalArgumentException
- NullPointerException
- ClassCastException
二 异常的声明和捕获
2.1 声明和捕获
声明:将问题标识出来,报告给调用者。
如果函数内通过throw抛出了编译时异常,而捕获,那么必须通过throws进行声明,让调用者去处理。
捕获:Java中对异常有针对性的语句进行捕获。
语句:
try
{
//需要被检测的语句。
}
catch(异常类 变量)//参数。
{
//异常的处理语句。
}
finally
{
//一定会被执行的语句。
} */
1.1.1声明 如果定义功能时有问题发生需要报告给调用者。可以通过在函数上使用throws关键字进行声明。
class Demo
{
void show(int x)throws Exception
{
if(x>)
throw new Exception();
else
System.out.println("show run");
}
} class ExceptionDemo7
{
public static void main(String[] args) throws Exception//throws Exception//在调用者上继续声明。
{
Demo d = new Demo();
d.show();//当调用了声明异常的方法时,必须有处理方式。要么捕获,要么声明。
}
}
结果
1.1.2 捕获:Java中对异常有针对性的语句进行捕获。
try
{
//需要被检测的语句。
}
catch(异常类 变量)//参数。
{
//异常的处理语句。
}
finally
{
//一定会被执行的语句。
} */
测试
package test; public class Test { public static void main(String[] args) {
Demo d = new Demo();
try {
d.show();
} catch (Exception e) {
System.out.println("异常发生了");
}//当调用了声明异常的方法时,必须有处理方式。要么捕获,要么声明。
System.out.println("Hello World!"); } }
class Demo
{
void show(int x)throws Exception
{
if(x>)
throw new Exception();
else
System.out.println("show run");
}
}
结果
注意:上面的结果 hello world 不会运行,而用捕获时,hello world 运行了
2.2 异常捕获图解
2.3 声明捕获的应用
package test; public class Test { public static void main(String[] args) {
try
{
Person p = new Person("xiaoming",-20);
System.out.println(p);
}
catch (NoAgeException ex)
{
System.out.println("异常啦");
} } } class NoAgeException extends RuntimeException
{
/*
为什么要定义构造函数,因为看到Java中的异常描述类中有提供对问题对象的初始化方法。
*/
NoAgeException()
{
super();
} NoAgeException(String message)
{
super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
}
} class Person
{
private String name;
private int age; Person(String name,int age)//throws NoAgeException
{
//加入逻辑判断。
if(age< || age>)
{
throw new NoAgeException(age+",年龄数值非法");
}
this.name = name;
this.age = age;
}
//定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString()
{
return "Person[name="+name+",age="+age+"]";
}
}
结果
构造函数到底抛出这个NoAgeException是继承Exception呢?还是继承RuntimeException呢?@@@
继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。
但是如果使用到了Person对象的数据,导致都失败的。
继承RuntimeExcpetion(用的多),不需要throws声明的,这时调用是不可能编写捕获代码的,因为调用根本就不知道有问题。
一旦发生NoAgeException,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码
三 运行时异常的应用@
/*
描述长方形,
属性:长和宽。
行为:获取面积。 考虑健壮性问题。
万一长和宽的数值非法。
描述问题,将问题封装成对象,用异常的方式来表示。
*/
/*
不知道要继承编译时异常还是运行时异常。 */
class NoValueException extends RuntimeException
{
NoValueException()
{
super();
}
NoValueException(String message)
{
super(message);
} } class Rec
{
private int length;
private int width;
Rec(int length,int width)
{
if(length<= ||width<=)
{
//抛出异常,但是不用声明,不需要调用者处理。就需要一旦问题发生让调用者端停止,让其修改代码。
throw new NoValueException("长或者宽的数值非法");
}
this.length = length;
this.width = width;
}
/**
定义面积函数。
*/
public int getArea()
{
return length*width;
} }
class ExceptionTest
{
public static void main(String[] args)
{ Rec r = new Rec(-,);
int area = r.getArea();
System.out.println("area="+area); }
}
四 编译时异常的应用@
4.1 理想处理事情
案例二:毕老师用电脑讲课。
两个对象:
老师:
属性:姓名。
行为:讲课。
电脑:
行为:运行。
package test; public class Test { public static void main(String[] args) {
Teacher t =new Teacher("liuwang");
t.prelect();
} }
class Notebook {
void run(){
System.out.println("电脑运行了");
}
}
class Teacher {
private String name;
private Notebook notebook;
Teacher (String name){
this.name=name;
notebook = new Notebook();
}
// 讲课
public void prelect (){
notebook.run();
System.out.println("讲课了"+name);
} }
4.2 考虑异常
考虑问题:
- 1,电脑蓝屏-->异常。
- 2,电脑冒烟-->异常。
注意:
- 调用到了声明异常的方法,在这里到底是捕获好呢?还是声明好呢?
有具体的捕获处理方式吗?有,那就捕获,没有,那么声明。
我可以处理,重启就可以了,重启是电脑的功能。
1,电脑蓝屏-->异常
下面红色的部分是变化的部分
package test; public class Test { public static void main(String[] args) {
Teacher t =new Teacher("liuwang");
t.prelect();
System.out.println("hello world");
} }
class LanPingException extends Exception{
LanPingException(){super();}
LanPingException(String s){
super(s);
} }
class Notebook {
int statu=;
void run() throws LanPingException{
if(statu==)
throw new LanPingException("蓝屏了");
System.out.println("电脑运行了");
}
void reset(){
statu=0;
System.out.println("重启了....");
}
}
class Teacher {
private String name;
private Notebook notebook;
Teacher (String name){
this.name=name;
notebook = new Notebook();
}
// 讲课
public void prelect (){
try {
notebook.run();
} catch (LanPingException e) {
notebook.reset();
//e.printStackTrace();
}
System.out.println("讲课了"+name);
} }
2,电脑冒烟-->异常。
注意:
- 方法上可以声明多个异常,并且需要多个catch来处理
package test; public class Test { public static void main(String[] args) {
Teacher t =new Teacher("liuwang");
t.prelect();
System.out.println("hello world");
} }
class LanPingException extends Exception{
LanPingException(){super();}
LanPingException(String s){
super(s);
} } class Notebook {
int statu=;
void run() throws LanPingException, MaoYanException{
if(statu==)
throw new LanPingException("蓝屏了");
if(statu==)
throw new MaoYanException("冒烟了");
System.out.println("电脑运行了");
}
void reset(){
statu=;
System.out.println("重启了....");
}
}
class Teacher {
private String name;
private Notebook notebook;
Teacher (String name){
this.name=name;
notebook = new Notebook();
}
// 练习
void lianxi(){
System.out.println("做练习");
}
// 讲课
public void prelect (){
try {
notebook.run();
} catch (LanPingException e) {
notebook.reset();
} catch (MaoYanException e) { e.printStackTrace();
}
System.out.println("讲课了"+name);
} }
结果
结果分析:这个结果是不正确的,明明电脑已经冒烟了但是,还在讲课
电脑冒烟了我直接处理不了,我处理的是让学生们去做练习。然后又声明出去(电脑冒烟处理不了,去找个师傅来修)
声明出去后,让调用讲课的知道。进行处理
package test; public class Test { public static void main(String[] args) {
Teacher t =new Teacher("liuwang");
try {
t.prelect();
} catch (MaoYanException e) {
System.out.println("huanlaoshi");
//e.printStackTrace();
}
System.out.println("hello world");
} }
class LanPingException extends Exception{
LanPingException(){super();}
LanPingException(String s){
super(s);
} } class Notebook {
int statu=;
void run() throws LanPingException, MaoYanException{
if(statu==)
throw new LanPingException("蓝屏了");
if(statu==)
throw new MaoYanException("冒烟了");
System.out.println("电脑运行了");
}
void reset(){
statu=;
System.out.println("重启了....");
}
}
class Teacher {
private String name;
private Notebook notebook;
Teacher (String name){
this.name=name;
notebook = new Notebook();
}
// 练习
void lianxi(){
System.out.println("做练习");
}
// 讲课
public void prelect () throws MaoYanException{
try {
notebook.run();
} catch (LanPingException e) {
notebook.reset();
} catch (MaoYanException e) {
lianxi();
//e.printStackTrace();
throw e;
}
System.out.println("讲课了"+name);
} }
异常的转换@@
讲课中冒烟,问题可以临时解决,是冒烟问题没有直接处理,所以就使用throws声明。
但是发现,这个问题不应该属于讲课的问题。调用讲课方法的调用者是处理不了这个冒烟问题的。
该调用者能处理的应该是冒烟导致的课程进行不下去的问题。
应该在列出一个异常。课时停止异常。
例如:储户去存钱,你是银行,你把钱存到金库里面,可是呢金库出现问题了,你的做法应该是catch (处理)金库的问题
接下来,throw(抛出)异常说今天不能存了,不是说金库出现了什么具体的问题,直接告诉不能存了,至于金库的问题应该是你要解决的问题
package test; public class Test { public static void main(String[] args) {
Teacher t =new Teacher("liuwang"); try {
t.prelect();
} catch (NoPlanException e) {
System.out.println("huanlaoshi");
} System.out.println("hello world");
} }
class LanPingException extends Exception{
LanPingException(){super();}
LanPingException(String s){
super(s);
} } class Notebook {
int statu=;
void run() throws LanPingException, MaoYanException{
if(statu==)
throw new LanPingException("蓝屏了");
if(statu==)
throw new MaoYanException("冒烟了");
System.out.println("电脑运行了");
}
void reset(){
statu=;
System.out.println("重启了....");
}
}
class Teacher {
private String name;
private Notebook notebook;
Teacher (String name){
this.name=name;
notebook = new Notebook();
}
// 练习
void lianxi(){
System.out.println("做练习");
}
// 讲课
public void prelect () throws NoPlanException {
try {
notebook.run();
} catch (LanPingException e) {
notebook.reset();
} catch (MaoYanException e) {
lianxi();
//e.printStackTrace();
throw new NoPlanException("没有");
}
System.out.println("讲课了"+name);
} }
java-异常处理2的更多相关文章
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- java异常处理(父子异常的处理)
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...
- Java 异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- Java提高篇——Java 异常处理
异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...
- java异常处理的设计
有一句这样话:一个衡量Java设计师水平和开发团队纪律性的好方法就是读读他们应用程序里的异常处理代码. 本文主要讨论开发Java程序时,如何设计异常处理的代码,如何时抛异常,捕获到了怎么处理,而不是讲 ...
- java异常处理机制
本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框 架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用系统 ...
随机推荐
- JAVA 垃圾回收读书笔记
对象已死 在JAVA代码运行中,会不停的创建对象,因为内存空间不是无限的,Java虚拟机必须不停的回收无用的数据空间.那么虚拟机是怎么判断对象空间是需要被回收的呢,也就是怎么样的数据算是垃圾数据呢? ...
- EL bug 之 javax.el.PropertyNotFoundException: Property 'Sub_Token' not found on type com.sunmo.stPhone.bean.User
javax.el.PropertyNotFoundException: Property 'Sub_Token' not found on type com.sunmo.stPhone.bean.Us ...
- phpCOW机制详解
写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改. COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C ...
- 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]
菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- 02_jQuery对象初识(二)筛选器1
0. HTML对象和jQuery对象的区别: 1.jQuery对象转换成DOM对象,用索引取出具体的标签 2.DOM对象转换成jQuery对象,$(DOM对象) 注意:jQuery对象保存到变量的时候 ...
- 第一周课堂笔记3th
1.bool值 True正确 False错误 数字为0时的显示 为空值时“” 2. str int bool布尔值 之间的转化 str int ...
- 使用 MongoDB shell访问MongoDB
- Konig定理及证明
Konig定理 由匈牙利数学家柯尼希(D.Konig)于1913年首先陈述的定理. 定理的内容:在0-1矩阵中,1的最大独立集合最小覆盖包含的元素个数相同,等价地,二分图中的最大匹配数等于这个图中的最 ...
- 【codeforces 508D】Tanya and Password
[题目链接]:http://codeforces.com/problemset/problem/508/D [题意] 给你一个字符的所有连续3个的子串; 让你复原出原串; (包含小写.大写字母以及数字 ...
- Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...