Java基础视频教程第10天_面向对象之异常2、包
一、面向对象——异常- finally
finally 代码块:定义一定执行的代码,通常用于关闭资源。 代码示例一:
class NoException extends Exception {}class Demo{public void method()throws NoException{try{连接数据库;操作数据库;}catch (SQLException e){对数据库进行异常处理;throw new NoException();//抛出一个新的异常对象}finally{关闭数据库;//一定执行的语句}}}
代码示例二:
class FinallyDemo{public static void main(String[] args){Demo d = new Demo();try{int x = d.div(4,-1);System.out.println("x="+x);}catch (FuShuException e){System.out.println(e.toString());return;//代表出现异常时,直接让程序停掉。}finally{System.out.println("finally");}System.out.println("over");}//结果会打印finally,不会打印over 。}
二、面向对象——异常-处理语句其他格式
格式一: try {} catch () {} 格式二: try {} catch () {} finally {} 格式三: try {} finally {} 小问题:
<span style="white-space:pre"> </span>示例一:
class Demo{public void method(){ //该异常内部已解决,可以不用声明try{throw new Exception();}catch (Exception e){}}}
示例二:
class Demo{public void method(){try{throw new Exception();}catch (Exception e){throw e;//此时将问题抛出,如果函数上未声明,编译不通过。}}}
示例三:
class Demo{public void method(){ //该异常内部已解决,可以不用声明try{throw new Exception();}catch (Exception e){try{throw e;}catch (Exception ex){}}}}
示例四:
class Demo{public void method(){ //这个程序抓住问题,但并没有处理,而是交给下一个程序处理。需要在函数上声明,否则编译失败。但是需要finally中的语句必须执行。try{throw new Exception();}finally{关闭资源;}}}
注意: catch 用于处理异常。如果没有 catch 就代表异常没有被处理过。如果该异常是检测时的异常,那么必须声明。
三、面向对象——异常-覆盖时的异常特点
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。 示例:
class AException extends Exception{}class BException extends AException{}class CException extends Exception{}class Fu{void show()throws AException{}}class Zi extends Fu{void show()throw AException //或者BException //或者不抛出异常 //不能抛出CException{}}
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。 示例:
class Fu{void show()throws AException,BException,CException{}}class Zi extends Fu{void show()throw AException,BException//最多只能抛出A、B、C三个。//或者不抛出{}}
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常。就必须要进行 try 处理,绝对不能抛出。 总结: 子类抛出的异常不能多于父类抛出的异常。
四、面向对象——异常练习
如果正常流程代码和问题处理代码结合的非常紧密,阅读性比较差。 异常的出现,能让正常流程代码和问题处理代码相分离。 /* 需求:获取圆形和长方形的面积,如果出现非法数值,视为获取问题时出现问题。用异常来表示这个问题。 */
class NoValueException extends RuntimeException //该异常类继承RuntimeException,以便当出现这个异常时让程序停止运行{NoValueException(String message){super(message);}}//定义一个接口,便于功能拓展interface Shape{void getArea();}class Rec implements Shape{private int len, wid;Rec(int len, int wid){if(len<=0 || wid<=0)throw new NoValueException("出现非法值");this.len = len;this.wid = wid;}public void getArea(){System.out.println("len*wid="+len*wid);}}class Circle implements Shape{private int radius;public static final double PI=3.14;//对于不会变化的数值都定义成常量Circle(int radius){if(radius<=0)throw new NoValueException("出现非法值");this.radius = radius;}public void getArea(){System.out.println("Circle: "+radius*radius*PI);}}class ExceptionTest1{public static void main(String[] args) {Rec r = new Rec(3,4);r.getArea();Circle c = new Circle(-5);c.getArea();System.out.println("over"); }}
五、面向对象——异常总结
异常: 是什么?是对问题的描述。将问题进行对象的封装。 ------------ 异常体系: Throwable |--Error |--Exception |--RuntimeException 异常体系的特点: 异常体系中的所有类及其建立的对象都具备可抛性。 也就是说可以被 throw 和 throws 关键字所操作。 只有异常体系具备这个特点。 -------------- throw 和 throws 的用法: throw 定义在函数内,用于抛出异常对象。 throws 定义在函数上,用于抛出异常类,多个异常类抛出时用逗号隔开。 当函数内有 throw 抛出异常对象,并未进行 try 处理时,必须要在函数上声明,否则编译失败。 但是, RuntimeException 除外;也就说,函数内如果抛出的是 RuntimeException 异常,函数上可以不用声明。 -------------- 如果函数声明了异常,调用者需要进行处理。处理方法可以 throws 可以 try 。 异常有两种: 编译时被检测异常 该异常在编译时,如果没有处理(没有抛也没有 try ),编译失败。 该异常被标识,代表可以被处理。 运行时异常(编译时不检测) 在编译时,不需要处理,编译器不检查。 该异常的发生,建议不处理,让程序停止,需要对代码进行修正。 -------------- 异常处理语句: try { 需要被检测的代码; } catch () { 处理异常的代码;//处理方式; } finally { 一定会执行的代码; } 有三个结合格式: 1. try { } catch () { } 2. try { } finally { } 3. try { } catch () { } finally { } 注意: 1, finally 中定义的通常是 关闭资源代码。因为资源必须释放。 2, finally 只有一种情况不会执行。当执行到 System.exit(0);/*系统退出,JVM结束*/ finally 不会执行。 -------------- 自定义异常: 定义类继承 Exception 或者 RuntimeException 目的: 1,为了让该自定义类具备可抛性。 2,让该类具备操作异常的共性方法。 当要定义自定义异常的信息时,可以使用父类已经定义好的功能。将异常异常信息传递给父类的构造函数。
class MyException extends Exception{MyException(String message){super(message);}}
自定义异常出现的好处:按照java的面向对象思想,将程序中出现的特有问题进行封装。 -------------- 异常的好处: 1,将问题进行封装。 2,将正常流程代码和问题处理代码相分离,方便于阅读。 异常的处理原则: 1,处理方式有两种: try catch 或者 throws 。 2,调用到抛出异常的功能时,抛出几个就处理几个。 一个 try 对应多个 catch 。 3,多个 catch ,父类的 catch 放到最下面。 4, catch 内,需要定义针对性的处理方式。不要简单的定义 printStackTrace()方法 ,输出语句。也不要不写。 A、当捕获到的异常,本功能处理不了时,可以继续在 catch 中抛出。 try { throw new AException(); } catch (AException e) { throw e; } B、如果该异常处理不了,但并不属于该功能出现的异常。 可以将异常转换后,再抛出和该功能相关的异常。 或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,让调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。 try { throw new AException(); } catch (AException e) { // 对AException处理。 throw new BException(); } 异常的注意事项: 在子父类覆盖时: 1,子类抛出的异常必须是父类的异常的子类或者子集。 2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。 参阅 ExceptionTest.java 老师用电脑上课 ExceptionTest1.java 图形面积 小知识:
class {public static void main(String[] args) {int x = 0;try{x = 4;}catch (){}finally{System.out.println("x="+x);//结果x=4;}}}
六、面向对象——练习四
略
七、面向对象——包 package
java中的包就是系统中的文件夹。 1、包的特点: 对类文件进行分类管理; 给类提供多层命名空间; 写在程序文件的第一行; 类名的全称是:包名.类名; 包也是一种封装形式。 2、编译: 编译时,如果源文件中定义了包,则需加参数,示例: javac -d . PackageDemo.java -d 指定包的存放目录(d:directory) . 代表当前目录 PackageDemo.java 代表源文件 3、运行: java pack.PackageDemo 运行时需指定包名 pack.PackageDemo 为pack包中可独立运行的 PackageDemo.class文件。 4、当运行文件不在当前目录下时,需配置classpath环境变量: set classpath=路径 5、定义类用 class ,定义接口用 interface ,定义包用 package 。 6、定义包时, package 必须放在代码的第一行。包名所有字母都小写。 示例代码:
package pack; //定义包时,必须写在代码的第一行;包名所有字母都要小写。class PackageDemo{public static void main(String[] args){System.out.println("Hello");}}
======编译时,如果没有指定包,java会把当前目录作为默认包的存在。 ======包的出现可以让java的源文件和运行文件相分离。
八、面向对象——包与包之间访问
访问规则: 1、访问不同包中的类时,需在类名前面加上包名;例如:packa.DemoA 2、包与包之间进行访问,被访问的包中的 类 以及 类中的成员,需要被 public 修饰。 3、包中的成员被 protected 修饰,那么,不同包中,只有该子类可以访问该成员。 4、同一个包中,类中的成员被 protected 修饰,其作用仅仅是: 当子类覆盖时,需提供相等或者更大的权限。 代码示例:
class DemoA{protected void show(){}}class DemoB extends DemoA{public void show(){}//或者是protected修饰}
5、当同一个包中有两个类都需要被其他包中的类建立对象访问。 那么,这两个类都需要被 public 修饰;同时,这两个类不能放在同一个文件中,需分开放置(因为类名被 public 修饰后,文件名必须与其保持一致)。 示例: package pack; public DemoA{} 放在DemoA.java中; package pack; public DemoB{} 放在DemoB.java中。 编译后,两个类文件将出现在同一个包(文件夹)中。 注意: 包与包之间可以使用的权限只有两种: public protected 成员之间访问权限总结: public protected default private 同一个类中 OK OK OK OK 同一个包中 OK OK OK 不同包中的子类 OK OK 不同包中的非子类 OK =====包的层次关系: 例如:pack.packA.packAB.packABC pack包中有子包packA,packA包中有子包packAB... =====包也是一种封装体,一个包中有十个类,但只有一个类被 public 修饰,那么其他九个类都只是对内使用的,不对外提供。 =====当包中的类被 public 修饰,但该类中的方法没有被 public 修饰,那么该方法也不对外提供。
九、面向对象——导入 import
import 导入支持类(可以是JDK基础类或者自己编写的类),可以供本类调用方法和属性。 例如: import ck.cka.ckb.ckc.DemoC;//ck.*//导入全部类 示例一: c:\myclass\packb\DemoA.class c:\myclass\packb\haha\DemoZ.class import packb.*;//导入的只是DemoA.class import packb.haha.*;//导入DemoZ.class 建议: 不要写通配符 * ;需要用到包中的哪个类就导入哪个类。因为不需要导入多余的类(否则会比较占用内存空间)。 注意: 1、如果导入的包中出现同名类名,那么在使用时,类名前必须加包名。 2、建议定包名不要重复,可以使用url来完成定义,url是唯一的。 3、url: Uniform Resource Locator 统一资源定位符。见百度百科。 4、一个程序中,用到其他包中的类时,可以不用写 import ,这样在使用该类时,写全类名即可。
十、面向对象——jar包
jar包:java的压缩包。 特点: A、方便项目的携带; B、方便于使用,只要在classpath设置jar路劲即可; C、数据库驱动,SSH框架等都是以jar包体现的。 示例代码:
package packa;public class DemoA{public void show(){System.out.println("demoA show run");}}package pack;import packa.*;class JarDemo {public static void main(String[] args) {DemoA a = new DemoA();a.show();System.out.println("Hello jar pack!");}}
编译DemoA.java,JarDemo.java 将其生成的包都放到d:\myclass文件夹中。生成packa包和pack包。(注意:需配置set classpath=d:\myclass) 此时,运行pack.JarDemo即可。 为了方便进行压缩: 切换到d:\myclass目录中,输入 jar -cf haha.jar pack packa -cf: 创建指定名称档案。 haha.jar: 创建后的jar包名称。 pack,packa: 被压缩的包。 在命令行中输入:jar -tf haha.jar 可查看haha.jar包中的目录信息。 当删除pack,packa两个包后,直接运行pack.JarDemo会失败。但是可以配置classpath路径:set classpath=d:\myclass\haha.jar 此时,运行pack.JarDemo OK。因为pack包被压缩到了haha.jar包中。 结论: 在开发中,拿到jar包后,将其放到classpath路径下即可运行。 在开发当中,需要找一些对象来完成相应功能。如果java网站上没有提供现有的工具,可以到互联网资源上查找。 比如:dem4j jar -cfv a.jar pack packa 压缩成a.jar并显示详细信息。 jar - tvf a.jar 显示a.jar中的详细信息。 jar -tf a.jar >d:\myclass\1.txt 在目录d:\myclass下生成1.txt文档显示详细信息。 dir >2.txt 显示当前目录下的文件和文件夹,并在当前路径下生成2.txt文档显示。 这叫数据重定向。 ======= >在doc命令行中用于指定路径??? ====== 虚拟机在启动时,运行main.class 类文件???
Java基础视频教程第10天_面向对象之异常2、包相关推荐
- 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字
文章目录 1.关键字:static 1.1.static的使用 1.2.类变量 vs 实例变量内存解析 1.3.自定义 ArrayUtil工具类的优化 1.4.static 的应用举例 1.5.练习 ...
- java多线程基础视频_[传智播客]Java基础视频教程之多线程2【10节课】
一.课程简介 该视频包括Java基础视频课程线程安全问题.代码优化.生产者消费者.死锁.守护线程等,详细课程如下所示>> 1. 传智播客毕向东Java基础视频教程-day12-01-多线程 ...
- 51自学网-Java基础视频教程-笔记 最后修改于2020/9/9
Java基础视频教程笔记 简介 正文 ==JVM Java Virtual Machine== 栈区 Stack Segment 堆区 Heap Segment 静态区 Data Segment 代码 ...
- xxx Java基础视频教程(含课件和源码)
本套视频是传智播客毕向东老师Java基础班的25天全程实录视频教程,适合零基础同学学习的Java基础视频教程. 内容涉及到的知识点: 1.计算机基本原理,Java语言发展简史,Java开发环境的搭建, ...
- 【JAVA】毕向东Java基础视频教程-笔记
传智播客-毕向东Java基础视频教程 <2013年-33days>版-学习代码记录 链接: GitHub库:JavaBXD33 目录 01-Java基础知识 02-Java对象细节 03- ...
- java基础入门课后习题答案_《Java基础入门》课后习题及答案
<Java基础入门>课后习题及答案Java基础入门,课后习题,答案 博学谷--让IT教学更简单,让IT学习更有效 第6章JavaAPI 一.填空题 1.在Java中定义了两个类来封装对字符 ...
- java商城项目面试题,Java基础视频教程
摘要 Apache Kafka是一个分布式消息发布订阅系统.它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Ap ...
- 移动平台 iPhone开发基础视频教程-第1季_千锋学院出品
该视频由清华大学硕士,原FSMLabs中国区技术总监 ,欧阳老师的视频, 他10多年软件开发经验,6年嵌入式行业教学经验,2年以上iPhone/iPad开发经验,2年以上Android开发经验,负责开 ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
最新文章
- CakePHP中出现persistent is not writable等Warning的解决方法
- Tomcat下server.xml怎样处理图片多路径映射问题
- C语言实现最大堆max_heap(附完整源码)
- Python学习入门10:零基础如何开始学习 Python?从小白变大牛!
- ASP.net控件开发系列之(一、二)
- 使用前端node.js 提供的服务器live-server
- 如何保证战略落地_博雅视野丨大健康战略时代,全龄康养如何落地?
- Linux 网络安全技巧
- 二维函数Z=g(X,Y)型,用卷积公式求概率密度,积分区域如何确定(上)
- EEGLAB使用流程
- 一个前端程序员的费曼技巧练习
- netron配置和使用
- 项目初始化及文件配置-黑马头条PC
- Actor模型的本质:究竟是要解决什么问题
- DNP3 模拟器使用教程
- HTML点击图片实现跳转的两种方法
- 什么是IoT、IT、OT、CT
- 使用 cobar 需要分布式 mysql 吗_用cobar搭建分布式数据库
- 电脑备忘录软件测试,桌面备忘录软件哪个好?2020电脑备忘录软件推荐
- Laya教程-对接抖音小游戏sdk(10分钟掌握)
热门文章
- FANUC机器人EIP协议焊机配置
- python视频教程
- 第10章第17节:使用iSlide的序列化工具设置动画的延迟时间 [PowerPoint精美幻灯片实战教程]
- Electron应用中实现调用外接摄像头并拍照上传
- 【计算机视觉】-图像二值化 - 图像分割 -图像卷积
- 【微信小程序控制硬件②】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器.(附带源码)
- 多标签学习之讲座版 (内部讨论, 未完待续)
- POP店铺设置京东拼购与拼购店铺一样么?
- 微软永远离破产只有 18 个月
- 集成饿了么、美团、百度等外卖系统功能