java-异常进阶-包的使用
一 finally
1.1 异常执行的顺序
package test;
public class Test {
public static void main(String[] args) {
Demo d = new Demo();
try {
d.show(-);
System.out.println("hello try");
} catch (NoShowException e) {
e.printStackTrace();
System.out.println("hello catch");
}
}
}
class NoShowException extends Exception
{
NoShowException(String message)
{
super(message);
}
}
class Demo
{
void show(int num)throws NoShowException
{
if(num<)
throw new NoShowException(num+",数值是非法的");
System.out.println("show ....."+num);
}
}
结果:

1.2 finally 作用
有一些特定的代码无论异常是否发生,都需要执行。
因为异常会引发程序跳转,导致有写语句执行不到。无法满足这个需求。
异常捕获处理时java提供解决方案。
应用场景;
定义一个功能往数据库中添加数据。 void add(Data data)throws NoAddException
{
//1,连接数据库。
try{
//2,添加数据。//添加数据时发生了异常情况。throw new SQLException();程序跳转,就执行不到断开连接。
//而断开连接必须要执行,因为不执行,连接资源在浪费。
//无论是否发生问题,都需要执行断开连接的动作,从而释放资源。
}catch(SQLException e)
{
//解决数据库的问题。
//同时将问题告诉调用者。
throw new NoAddException();
}
finally
{
//3,断开连接。
} }
总结:finally到底什么时候用?
只要程序中使用到了具体的资源(数据库连接,IO资源,网络连接socket等)
需要释放,都必须定义在finally中。你在定义程序,只要问题发生与否,
指定程序都需要执行时,就定义finally中。
二 异常的组合方式
try catch finally 组合方式:
1 .try catch : 对代码进行异常检测,并对检测的异常传递给catch处理。
try catch : 对代码进行异常检测,并对检测的异常传递给catch处理。
异常捕获处理。
void show()//不用throws
{
try{
throw new Exception();
}catch(Exception e)
{ }
}
2. try finally : 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。
异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。
只为关闭资源。
void show()//需要throws
{
try{
throw new Exception();
}finally
{ }
}
3,
try catch finally
检测异常,并传递给catch处理,并定义资源释放。
4,try catch1 catch2 catch3......
class ExceptionDemo10
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
三 异常在继承或实现的细节
异常在继承或者实现中的使用细节:★★★★★
1,子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。
2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
3,当被覆盖的方法没有异常声明时,子类覆盖时时无法声明异常的。
举例:父类存在这种情况,接口也有这种情况,
问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常,怎么办?
无法进行throws声明,只能catch的捕获。万一问题处理不了呢?catch中继续throw抛出,但是只能将异常转换成RuntimeException子类抛出。
1,子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。
原因:如是不是这样,会发生类型转换异常.具体看下面代码讲解
下面红色部分产生类型转换异常 //AException ex = new BException();
ps:父类有问题了,在覆盖的时候子类不能有更多的问题
Exception
|--AException
|--AAException
|--BException class AException extends Exception
{
}
class BException extends Exception
{
}
class AAException extends AException
{
} class Fu
{
void show()
{ }
} class Tool
{
void method(Fu f)//Fu f = new Zi();
{
try
{
f.show();
}
catch (AException ex)//AException ex = new BException();
{
}
}
}
Tool t = new Tool();
//t.method(new Fu());
t.method(new Zi()); class Zi extends Fu
{
void show()throws BException
{ } }
四 习题
.
写出程序结果
class Demo
{
public static void func()//throws Exception
{
try
{
throw new Exception();//抛出编译时异常,并没有catch处理,必须throws声明。
}
finally
{
System.out.println("B");
}
}
public static void main(String[] args)
{
try
{
func();
System.out.println("A");
}
catch(Exception e)
{
System.out.println("C");
}
System.out.println("D");
}
} -----------B C D
.写出程序结果
class Demo
{
public static void main(String[] args)
{
try
{
showExce();
System.out.println("A");
}
catch(Exception e)
{
System.out.println("B");
}
finally
{
System.out.println("C");
}
System.out.println("D");
}
public static void showExce()throws Exception
{
throw new Exception();
}
}
B C D .写出程序结果:
class Demo
{
public static void func()
{
try
{
throw new Exception();//有throw抛出异常,功能会在这里结束。下面的语句都是废话。
System.out.println("A");
}
catch(Exception e)
{
System.out.println("B");
}
}
public static void main(String[] args)
{
try
{
func();
}
catch(Exception e)
{
System.out.println("C");
}
System.out.println("D");
}
} B D
---------------- .写出程序结果
class Exc0 extends Exception{}
class Exc1 extends Exc0{} class Demo
{
public static void main(String[] args)
{
try
{
throw new Exc1();
}
catch(Exception e)//父类的catch必须放在最下面。否则编译失败。
{
System.out.println("Exception");
}
catch(Exc0 e)
{
System.out.println("Exc0");
}
}
}
--------------- 5.写出程序结果 @
class Test
{
public static String output="";
public static void foo(int i)
{
try
{
if(i==)
throw new Exception();
output+="";
}
catch(Exception e)
{
output+="";
return;
}
finally
{
output+="";
}
output+="";
}
public static void main(String args[])
{
foo();
System.out.println(output);//134
foo();
System.out.println(output); //13423
}
} 134 13423
----------------------
.编程题。
建立一个图形接口,声明一个面积函数。圆形和矩形都实现这个接口,并得出两个图形的面积。
注:体现面向对象的特征,对数值进行判断。用异常处理。不合法的数值要出现“这个数值是非法的”提示,不再进行运算。 interface Shape
{
//获取面积函数。
double getArea();
} class NoValueException extends RuntimeException
{
NoValueException(String message)
{
super(message);
}
} class Rec implements Shape
{
private int length;
private int width;
Rec(int length,int width)
{
if(length<= || width<=)
throw new NoValueException("非法数值");
this.length = length;
this.width = width;
} public double getArea()
{
return length*width;
}
} class Circle implements Shape
{
private int radius;
private static final double PI = 3.14;
Circle(int radius)
{
this.radius = radius;
}
public double getAge()
{
return radius*radius*PI;
}
} ----------------------
.
补足compare函数内的代码,不许添加其他函数。
class Circle
{
private static double pi=3.14;
private double radius;
public Circle(double r)
{
radius=r;
}
public static double compare(Circle[] cir)
{
//程序代码
/*
其实就是获取数组中的最大值。
*/
// double max = cir[0].radius;// 初始化的是圆数组中的任意一个圆对象的半径。
int maxIndex = ;//初始化的是数组任意一个角标。 for(int x=; x<cir.length; x++)
{
if(cir[x].radius>cir[maxIndex].radius)//if(person.age > person1.age) if(age>age1)
{
maxIndex = x;
}
} return cir[maxIndex].radius; }
}
class TC
{
public static void main(String[] args)
{
Circle cir[]=new Circle[];//创建一个Circle类型的数组,数组有3个元素。Circle[] arr = new Circle[3];
//分别对数组每一个元素进行初始化。
cir[]=new Circle(1.0);
cir[]=new Circle(2.0);
cir[]=new Circle(4.0);
System.out.println("最大的半径值是:"+Circle.compare(cir));
}
}
java-异常进阶-包的使用的更多相关文章
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- Java基础---多态、内部类、异常、包
第一讲 多态 多态可以理解为事物存在的多种体现形态. 例:动物中猫,狗.猫这个对象对应的类型是猫类型,如:猫 x = new猫(); 同时猫也是动物中的一种,也可以把猫称为动物.动物 y = ...
- Java 多态、内部类、异常、包
一.多态 1. 概述 理解:多态可以理解为事物存在的多种体(表)现形态. 例如: 动物中的猫和狗. 猫这个对象对应的是猫类型,例如:猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为 ...
- Java基础进阶:时间类要点摘要,时间Date类实现格式化与解析源码实现详解,LocalDateTime时间类格式化与解析源码实现详解,Period,Duration获取时间间隔与源码实现,程序异常解析与处理方式
要点摘要 课堂笔记 日期相关 JDK7 日期类-Date 概述 表示一个时间点对象,这个时间点是以1970年1月1日为参考点; 作用 可以通过该类的对象,表示一个时间,并面向对象操作时间; 构造方法 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- Java 异常讲解(转)
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWrite ...
- 一篇不错的讲解Java异常的文章(转载)
http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已 ...
- java异常——RuntimeException和User Define Exception
1.RuntimeException public class RuntimeException { public static void main(String[] args) { // TODO ...
- 有效处理java异常的三个原则
Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? ...
随机推荐
- 记录一次dubbo不能正常抛出特定异常
BUG场景 今天同事的代码中出现一个问题,让我帮忙排查一下.原代码大致如下 dubbo服务消费者: @Resource private IPayWayService payWayService; @R ...
- Clion IDE的安装
/下载压缩包 wget https://download.jetbrains.8686c.com/cpp/CLion-2016.2.2.tar.gz //解压 tar -zxvf CLion-2016 ...
- LUOGU P1453 城市环路(基环树+dp)
传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...
- 菜鸟安装 CocoaPods
在 iOS 项目开发中,经常会用到第三方的源代码,CocoaPods 就是为了方便管理这些源码的工具. 在官方教程里面,安装看起来非常简单 $ [sudo] gem install cocoapods ...
- UICollectionView入门--使用系统UICollectionViewFlowLayout布局类
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rainbownight.blog.51cto.com/1336585/13237 ...
- 89 k数和
原题网址:https://www.lintcode.com/problem/k-sum/description 描述 给定n个不同的正整数,整数k(k < = n)以及一个目标数字. 在这n个数 ...
- 101 删除排序数组中的重复数字 II
原题网址:http://www.lintcode.com/zh-cn/problem/remove-duplicates-from-sorted-array-ii/# 跟进“删除重复数字”: 如果可以 ...
- utils04_搭建私有Git服务器
1.远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改.GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给G ...
- 19.10.14-Q
小$P$的咕事 总结: 还行,就是$T1$写的慢了,$T2,T3$暴力有点锅 T1 小模拟. 打就是了. 可以小小的手玩一下. (考试的时候某同志人肉对拍了$20min$)=.= 418 ms 360 ...
- 获取请求header的各种方法
部分代码非原创 不定期更新 PHP function get_all_header() { // 忽略获取的header数据.这个函数后面会用到.主要是起过滤作用 $ignore = array(' ...
