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 packapackaaDemoAA 91 DemoA.class 92 import packa.*;//仅仅指的是使用的类所属的包是packa下的。不会导入packa中子包中的类。 93 如果要使用DemoAA 94 import packa.packaa.*; 95 new DemoAA(); 96 97 特殊情况二://不同包中有了相同名称的类。使用该类时,必须指定包名。 98 packaDemo.class 99 packbDemo.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