《day13--异常的进阶和包的使用》

  1 //101-finally的使用&102-finally的使用场景
  2 /*
  3 需求:有一些特定的代码,无论异常是否发生,都需要执行,
  4 因为异常会引发程序的跳转,导致有些语句执行不到,无法满足这个需求。
  5 异常捕获处理时,java提供了解决方案。
  6 try catch finally.
  7 finally:就是解决这个问题的。这个代码块中存放的代码都是一定会被执行的。
  8
  9 应用场景:
 10 定义一个功能,往数据库中添加数据。
 11 void add(Data data)throws NoAddException
 12 {
 13     //1,连接数据库。
 14     try{
 15     //2,添加数据。//很有可能在添加数据时,发生了异常情况,很可能发生了异常情况:throw new SQLException();程序就会跳转就执行不到断开连接,
 16                     //而断开连接必须要执行,因为不执行断开功能,
 17                     //那么连接资源会浪费。无论是否发生问题都需要执行断开连接的动作,从而释放资源。
 18     }catch(sqlException e)
 19     {
 20         //解决数据库的问题。
 21         //同时将问题告诉调用者。
 22         //throw new NotAddException();
 23     }
 24     finally
 25     {
 26         //3,断开连接。
 27     }
 28
 29 //总结:finally到底什么时候用,
 30 只要程序中使用到了具体的资源(数据库,IO资源,网络连接(socket)等)
 31 需要释放,都必须定义在finally中。你这定义程序时,只要问题发生与否,
 32 指定程序都需要执行时,就定义在finally里面。
 33 }
 34 */
 35 class NoShowException extends Exception
 36 {
 37     NoShowException()
 38     {
 39         super();
 40     }
 41     NoShowException(String message)
 42     {
 43         super(message);
 44     }
 45 }
 46
 47 class Demo
 48 {
 49     void show(int num)throws NoShowException
 50     {
 51         if(num<0)
 52             throw new NoShowException(num+",数值是非法的");
 53         System.out.println("show run...."+num);
 54     }
 55 }
 56 class ExceptionDemo10
 57 {
 58     public static void main(String[] args)
 59     {
 60         /*
 61         Demo d = new Demo();
 62         //因为调用到了声明异常的show方法,所以调用者要给出处理的方式,
 63         //要么继续声明,要么捕获。
 64         try
 65         {
 66             d.show(-5);
 67
 68
 69         }
 70         catch (NoShowException ex)
 71         {
 72             System.out.println(ex.toString());//打印的是异常名称+异常信息。
 73             //如果异常发生,处理完毕后,希望功能结束。
 74             return;
 75
 76
 77             //注意:有一种情况发生,finally也不执行,
 78 //            System.exit(0);//退出jvm.
 79         }
 80         finally
 81         {
 82             System.out.println("hello");
 83         }
 84         System.out.println("over");
 85         */
 86         Test t = new Test();
 87         int num = t.show(-4);
 88         System.out.println("num="+num);
 89     }
 90 }
 91
 92 class Test
 93 {
 94     int show(int num)
 95     {
 96         try
 97         {
 98             if(num<0)
 99                 throw new RuntimeException();
100             return 4;
101         }
102         catch (Exception e)
103         {
104             System.out.println(e.toString());
105             return 200;
106         }
107         finally
108         {
109             System.out.println("finally run");
110             return 100;
111         }
112     }
113 }
 1 //103-trycatchfinally的组合方式。
 2 /*
 3 try catch finally几种组合方式;
 4
 5 1,
 6 try catch: 对代码进行异常检测,并对检测的异常传递给catch处理。
 7             异常捕获处理。
 8
 9 void show()//不用throws
10 {
11     try{
12     throw new Exception();
13     }catch(Exception e)
14     {
15
16     }
17 }
18 2
19 try finally:  对代码进行异常检测,检测到异常后因为没有catch所以一样会被默认jvm抛出。
20               异常是没有捕获处理的。但是功能所开启的资源需要进行关闭,所以有finally.
21               关闭资源。
22
23
24 void show()//需要throws
25 {
26     try{
27     throw new Exception();
28     }finally
29     {
30
31     }
32 }
33
34 3,
35 try catch finally
36 检测异常,并传递给catch处理,并定于资源释放,
37
38 4,try catch1 catch2 catch3....
39 */
40
41 class
42 {
43     public static void main(String[] args)
44     {
45         System.out.println("Hello World!");
46     }
47 }
 1 //104-异常在覆盖中的细节。
 2 /*
 3 异常在继承或者实现中的使用细节:
 4 1,子类在覆盖父类方法时,如果父类的方法声明异常,
 5 子类只能声明父类异常或者该异常的子类,或者不声明。
 6 2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
 7 3,当被覆盖的方法没有异常声明时,子类覆盖时是无法声明异常的。
 8     举例:父类存在这种情况,接口也有这种情况。
 9     问题:接口中没有声明异常,而实现的子类覆盖方法时却发生了异常,怎么办?
10         无法进行throws声明,只能进行catch的捕获。万一问题处理不了呢?可以在
11         catch中继续throw抛出,但是只能将异常转换成RuntimeException抛出。
12
13     Interface Inter
14     {
15         public void show();
16     }
17     class Demo implements Inter
18     {
19         public void show()//不能进行throws声明。把编译时异常转换成运行时异常。
20         {
21             try{
22             throw new Exception();
23             }catch(Exception e)
24             {
25                 code..//自己的处理方式。
26                 //不能处理时,转换。
27                 throw new RuntimeException("");//告知调用者问题所在。
28             }
29         }
30     }
31 Exception
32     |-AException
33         |-AAException
34     |-BException
35
36
37
38 */
39 class AException extends Exception
40 {
41 }
42 class BExcepiton extends Exception
43 {
44 }
45 class AAExcepiton extends AException
46 {
47 }
48
49
50 class Fu
51 {
52     void show()throws AException
53     {
54
55     }
56 }
57
58 class Tool
59 {
60     void method(Fu f)
61     {
62         try
63         {
64             f.show();
65         }
66         catch (AException ex)//AException ex = new AAException();
67         {
68         }
69
70     }
71 }
72 Tool t = new Tool();
73 //t.method(new Fu());
74 t.method(new Zi());
75
76
77 class Zi extends Fu
78 {
79     void show()throws AAException
80     {
81
82     }
83 }
84
85 class ExceptionDemo12
86 {
87     public static void main(String[] args)
88     {
89         Zi z = new Zi();
90         try
91         {
92             z.show();
93         }
94         catch (AException e)
95         {
96         }
97     }
98 }
  1 package mypack;//包名中的所有字母都小写。
  2 /*
  3 对于多个类为了便于管理(类的同名情况),所以Java提供了解决方案。
  4 包机制:落实到操作系统上,就是文件夹。对Java的文件进行分文件管理。
  5
  6 包的定义:使用关键字package。
  7
  8 包的作用:
  9     1,对类文件进行管理。
 10     2,给类文件提供了名称空间。
 11
 12 对带有package定义的java文件进行指定类文件位置的编译方式。
 13 javac -d 目录 源文件
 14
 15 如果目录选择的不是当前目录,想要访问包中类。
 16 通过设置classpath.  set classpath=包所在的父目录
 17
 18 =====================================================
 19 包与包之间的访问:
 20 PackageDemo1.java:24: 错误: 找不到符号
 21                 DemoA d = new DemoA();
 22                 ^
 23   符号:   类 DemoA
 24   位置: 类 PackageDemo1
 25 PackageDemo1.java:24: 错误: 找不到符号
 26                 DemoA d = new DemoA();
 27                               ^
 28   符号:   类 DemoA
 29   位置: 类 PackageDemo1
 30
 31
 32 原因是:类名写错,有了包的类,类名:包名.类名。这才是类的全名称。
 33 解决:使用DemoA,必须写packa.DemoA.
 34
 35 ================================================================
 36 PackageDemo1.java:41: 错误: 程序包packa不存在
 37                 packa.DemoA d = new packa.DemoA();
 38                      ^
 39 PackageDemo1.java:41: 错误: 程序包packa不存在
 40                 packa.DemoA d = new packa.DemoA();
 41                                          ^
 42 2 个错误
 43
 44 原因:packa这个包没有找到,在当前目录下。
 45 解决:应该告诉jvm这个程序包的位置. set classpath.
 46
 47 ====================================================================
 48 PackageDemo1.java:41: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
 49                 packa.DemoA d = new packa.DemoA();
 50                      ^
 51 PackageDemo1.java:41: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
 52                 packa.DemoA d = new packa.DemoA();
 53                                          ^
 54 2 个错误
 55
 56 原因:DemoA这个类在packa这个包中权限不够。
 57 解决:提升DemoA的权限。提升到哪个权限。到public.
 58
 59 ============================================================================
 60 PackageDemo1.java:66: 错误: show()在DemoA中不是公共的; 无法从外部程序包中对其进行访问
 61                 d.show();
 62                  ^
 63 1 个错误
 64
 65 原因:show方法的权限不够,
 66 解决:show用public修饰。
 67
 68 总结;
 69 包与包之间的类在访问时,被访问的类以及成员都必须被public修饰。
 70
 71 注意;被public修饰的类或者接口,所属的java文件名必须和类或者接口名称一致。
 72
 73 包与包之间继承,父类可以给其他包中的子类提供一个特殊的权限protected,只有
 74 继承为子类后,才可以访问的权限。
 75
 76             public        protected        default        private
 77 一个类中      ok           ok              ok          ok
 78 一个包中      ok           ok              ok
 79 子类中        ok           ok
 80 不同包中      ok
 81
 82 包与包之中访问只有两种权限可以用,public  protected(该权限只能给不同包中的子类使用。)
 83
 84 =================================================================================
 85 包的出现导致类的名称过长,导致书写不方便,咋办?
 86 可以通过关键字来解决,import 导入。
 87 import作用简化类名书写。省略包名。
 88
 89 特殊情况一:
 90 packa\packaa\DemoAA
 91      \DemoA.class
 92 import packa.*;//仅仅指的是使用的类所属的包是packa下的。不会导入packa中子包中的类。
 93 如果要使用DemoAA
 94 import packa.packaa.*;
 95 new DemoAA();
 96
 97 特殊情况二://不同包中有了相同名称的类。使用该类时,必须指定包名。
 98 packa\Demo.class
 99 packb\Demo.class
100
101 import packa.Demo;
102 import packb.Demo;
103
104 new packa.Demo();
105 */
106 //import packa.DemoA;    //import packa.*不建议这样写。
107 import packa.*;
108
109 class PackageDemo1
110 {
111     public static void main(String[] args)
112     {
113     //    packa.DemoA d = new packa.DemoA();
114         DemoA d = new DemoA();
115         d.show();
116
117         //packfu.DemoFu d1 = new packfu.DemoFu();
118         //d1.showFu();
119         System.out.println("Hello World!");
120     }
121 }
 1 package packa;
 2
 3 public class DemoA extends packfu.DemoFu
 4 {
 5     public void show()
 6     {
 7         showFu();
 8         System.out.println("demoa show run");
 9     }
10 }
1 package packfu;
2 public class DemoFu
3 {
4     /*public*/protected/*保护*/ void showFu()
5     {
6         System.out.println("demofu show run");
7     }
8 }
 1 /*
 2 Jar包:java中的压缩包。
 3
 4 直接将jar包导入到classpath路径中即可。
 5
 6 */
 7 package pack;
 8
 9 class  JarDemo
10 {
11     public static void main(String[] args)
12     {
13         System.out.println("Hello jar!");
14     }
15 }
16
17 //day13/pack/JarDemo.class ---jar--->day13/haha.jar/pack/JarDemo.class
时间: 2024-11-25 22:29:14

《day13--异常的进阶和包的使用》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: