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的异常处理框 架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用系统 ...
随机推荐
- MYSQL获取同时关注了某两个(或者N个)用户的用户
使用redis的set类型数据的话会比较容易,但是业务场景就是在mysql里面,因此也需要思考解决方法 表结构: CREATE TABLE `table_name` ( `id` ) unsigned ...
- js声明变量的三种方式
JS 声明变量的三种方式 (1)使用变量步骤:a.声明-->b.赋值-->3.调用 正确用法: <script type="text/javascript"> ...
- Git 之 版本回退
1. git log 定义:该命令显示从最近到最远的提交日志.每一次提交都有对应的 commit id 和 commit message.
- <scrapy爬虫>爬取校花信息及图片
1.创建scrapy项目 dos窗口输入: scrapy startproject xiaohuar cd xiaohuar 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) # ...
- Unity优化垃圾回收GC
- svn插件的所有链接
http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240
- SQL Server日常积累
1: 在Sql Server 中增加一列语句: alter table table_name add column_name [not null] [references ....] 例 ...
- 阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务
1.HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎.Ganos已作为云数据库时空引擎与数据库平台融合,建立了以自研云原生数据库POALRDB为基础,联合NoSQL大数据 ...
- Spring框架中的核心思想包括什么
(1)依赖注入 (2)控制反转 (3)面向切面
- 说说前端开发中的SEO
SEO(Search Engine Optimization),就是传说中的搜索引擎优化,是指为了增加网页在搜索引擎自然搜索结果中的收录数量以及提升排序位置而做的优化行为.我认为这是一门说来简单,但操 ...