//101-finally的使用&102-finally的使用场景
/*
需求:有一些特定的代码,无论异常是否发生,都需要执行,
因为异常会引发程序的跳转,导致有些语句执行不到,无法满足这个需求。
异常捕获处理时,java提供了解决方案。
try catch finally.
finally:就是解决这个问题的。这个代码块中存放的代码都是一定会被执行的。 应用场景:
定义一个功能,往数据库中添加数据。
void add(Data data)throws NoAddException
{
//1,连接数据库。
try{
//2,添加数据。//很有可能在添加数据时,发生了异常情况,很可能发生了异常情况:throw new SQLException();程序就会跳转就执行不到断开连接,
//而断开连接必须要执行,因为不执行断开功能,
//那么连接资源会浪费。无论是否发生问题都需要执行断开连接的动作,从而释放资源。
}catch(sqlException e)
{
//解决数据库的问题。
//同时将问题告诉调用者。
//throw new NotAddException();
}
finally
{
//3,断开连接。
} //总结:finally到底什么时候用,
只要程序中使用到了具体的资源(数据库,IO资源,网络连接(socket)等)
需要释放,都必须定义在finally中。你这定义程序时,只要问题发生与否,
指定程序都需要执行时,就定义在finally里面。
}
*/
class NoShowException extends Exception
{
NoShowException()
{
super();
}
NoShowException(String message)
{
super(message);
}
} class Demo
{
void show(int num)throws NoShowException
{
if(num<0)
throw new NoShowException(num+",数值是非法的");
System.out.println("show run...."+num);
}
}
class ExceptionDemo10
{
public static void main(String[] args)
{
/*
Demo d = new Demo();
//因为调用到了声明异常的show方法,所以调用者要给出处理的方式,
//要么继续声明,要么捕获。
try
{
d.show(-5); }
catch (NoShowException ex)
{
System.out.println(ex.toString());//打印的是异常名称+异常信息。
//如果异常发生,处理完毕后,希望功能结束。
return; //注意:有一种情况发生,finally也不执行,
// System.exit(0);//退出jvm.
}
finally
{
System.out.println("hello");
}
System.out.println("over");
*/
Test t = new Test();
int num = t.show(-4);
System.out.println("num="+num);
}
} class Test
{
int show(int num)
{
try
{
if(num<0)
throw new RuntimeException();
return 4;
}
catch (Exception e)
{
System.out.println(e.toString());
return 200;
}
finally
{
System.out.println("finally run");
return 100;
}
}
}
 //103-trycatchfinally的组合方式。
/*
try catch finally几种组合方式; 1,
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
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
 //104-异常在覆盖中的细节。
/*
异常在继承或者实现中的使用细节:
1,子类在覆盖父类方法时,如果父类的方法声明异常,
子类只能声明父类异常或者该异常的子类,或者不声明。
2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
3,当被覆盖的方法没有异常声明时,子类覆盖时是无法声明异常的。
举例:父类存在这种情况,接口也有这种情况。
问题:接口中没有声明异常,而实现的子类覆盖方法时却发生了异常,怎么办?
无法进行throws声明,只能进行catch的捕获。万一问题处理不了呢?可以在
catch中继续throw抛出,但是只能将异常转换成RuntimeException抛出。 Interface Inter
{
public void show();
}
class Demo implements Inter
{
public void show()//不能进行throws声明。把编译时异常转换成运行时异常。
{
try{
throw new Exception();
}catch(Exception e)
{
code..//自己的处理方式。
//不能处理时,转换。
throw new RuntimeException("");//告知调用者问题所在。
}
}
}
Exception
|-AException
|-AAException
|-BException */
class AException extends Exception
{
}
class BExcepiton extends Exception
{
}
class AAExcepiton extends AException
{
} class Fu
{
void show()throws AException
{ }
} class Tool
{
void method(Fu f)
{
try
{
f.show();
}
catch (AException ex)//AException ex = new AAException();
{
} }
}
Tool t = new Tool();
//t.method(new Fu());
t.method(new Zi()); class Zi extends Fu
{
void show()throws AAException
{ }
} class ExceptionDemo12
{
public static void main(String[] args)
{
Zi z = new Zi();
try
{
z.show();
}
catch (AException e)
{
}
}
}
 package mypack;//包名中的所有字母都小写。
/*
对于多个类为了便于管理(类的同名情况),所以Java提供了解决方案。
包机制:落实到操作系统上,就是文件夹。对Java的文件进行分文件管理。 包的定义:使用关键字package。 包的作用:
1,对类文件进行管理。
2,给类文件提供了名称空间。 对带有package定义的java文件进行指定类文件位置的编译方式。
javac -d 目录 源文件 如果目录选择的不是当前目录,想要访问包中类。
通过设置classpath. set classpath=包所在的父目录 =====================================================
包与包之间的访问:
PackageDemo1.java:24: 错误: 找不到符号
DemoA d = new DemoA();
^
符号: 类 DemoA
位置: 类 PackageDemo1
PackageDemo1.java:24: 错误: 找不到符号
DemoA d = new DemoA();
^
符号: 类 DemoA
位置: 类 PackageDemo1 原因是:类名写错,有了包的类,类名:包名.类名。这才是类的全名称。
解决:使用DemoA,必须写packa.DemoA. ================================================================
PackageDemo1.java:41: 错误: 程序包packa不存在
packa.DemoA d = new packa.DemoA();
^
PackageDemo1.java:41: 错误: 程序包packa不存在
packa.DemoA d = new packa.DemoA();
^
2 个错误 原因:packa这个包没有找到,在当前目录下。
解决:应该告诉jvm这个程序包的位置. set classpath. ====================================================================
PackageDemo1.java:41: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
packa.DemoA d = new packa.DemoA();
^
PackageDemo1.java:41: 错误: DemoA在packa中不是公共的; 无法从外部程序包中对其进行访问
packa.DemoA d = new packa.DemoA();
^
2 个错误 原因:DemoA这个类在packa这个包中权限不够。
解决:提升DemoA的权限。提升到哪个权限。到public. ============================================================================
PackageDemo1.java:66: 错误: show()在DemoA中不是公共的; 无法从外部程序包中对其进行访问
d.show();
^
1 个错误 原因:show方法的权限不够,
解决:show用public修饰。 总结;
包与包之间的类在访问时,被访问的类以及成员都必须被public修饰。 注意;被public修饰的类或者接口,所属的java文件名必须和类或者接口名称一致。 包与包之间继承,父类可以给其他包中的子类提供一个特殊的权限protected,只有
继承为子类后,才可以访问的权限。 public protected default private
一个类中 ok ok ok ok
一个包中 ok ok ok
子类中 ok ok
不同包中 ok 包与包之中访问只有两种权限可以用,public protected(该权限只能给不同包中的子类使用。) =================================================================================
包的出现导致类的名称过长,导致书写不方便,咋办?
可以通过关键字来解决,import 导入。
import作用简化类名书写。省略包名。 特殊情况一:
packa\packaa\DemoAA
\DemoA.class
import packa.*;//仅仅指的是使用的类所属的包是packa下的。不会导入packa中子包中的类。
如果要使用DemoAA
import packa.packaa.*;
new DemoAA(); 特殊情况二://不同包中有了相同名称的类。使用该类时,必须指定包名。
packa\Demo.class
packb\Demo.class import packa.Demo;
import packb.Demo; new packa.Demo();
*/
//import packa.DemoA; //import packa.*不建议这样写。
import packa.*; class PackageDemo1
{
public static void main(String[] args)
{
// packa.DemoA d = new packa.DemoA();
DemoA d = new DemoA();
d.show(); //packfu.DemoFu d1 = new packfu.DemoFu();
//d1.showFu();
System.out.println("Hello World!");
}
}
 package packa;

 public class DemoA extends packfu.DemoFu
{
public void show()
{
showFu();
System.out.println("demoa show run");
}
}
 package packfu;
public class DemoFu
{
/*public*/protected/*保护*/ void showFu()
{
System.out.println("demofu show run");
}
}
 /*
Jar包:java中的压缩包。 直接将jar包导入到classpath路径中即可。 */
package pack; class JarDemo
{
public static void main(String[] args)
{
System.out.println("Hello jar!");
}
} //day13/pack/JarDemo.class ---jar--->day13/haha.jar/pack/JarDemo.class

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

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. CLGeocoder Error Domain=kCLErrorDomain Code=2

    使用CLGeocoder解码地址时,遇到错误 Error Domain=kCLErrorDomain Code=2 代码: #pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定 ...

  2. 【CodeForces 651B】Beautiful Paintings 排序+贪心

    题目大意: 给定集合,对于任意一个的排列,记,求. 很明显每次搞出一个长度为的最长上升序列,然后把元素给删掉,答案增加. 直接暴力需要. 但是可以进行优化. 设有个,将个数从小到大排序,记为长度为的数 ...

  3. django 2

    创建一个管理员用户 首先,我们需要创建一个用户可以登录到管理网站. 运行 下面的命令: $ python manage.py createsuperuser 输入你想要的用户名,按回车. Userna ...

  4. python 练习 23

    python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句…… 执行语句可以是单个语句或语句 ...

  5. Qt之Concurrent框架

    简述 QtConcurrent命名空间提供了一个高级API来编写多线程程序,而无需使用低级线程原语,例如:互斥.读写锁.等待条件或信号量.使用QtConcurrent编写的程序使用的线程数量会自动根据 ...

  6. (11)lambda表达式用法

    * lambda 简述    lambda只是一个表达式,函数体比def简单很多    lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.    lam ...

  7. 初学java之触发响应事件举例子

    设置一个触发响应事件? 比如消息框..... package hello; import javax.swing.*; import project.readerListen; import java ...

  8. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算法

    参考: http://www.slideshare.net/lucenerevolution/what-is-inaluceneagrandfinal http://www.slideshare.ne ...

  10. ES mlockall作用——preventing that memory from being paged to the swap area

    elasticsearch还有一个重要的参数bootstrap.mlockall,这个参数的目的是当你无法关闭系统的swap的时候,建议把这个参数设为true.防止在内存不够用的时候,elastics ...