2-1_12-16-2014-自定义异常

来源:互联网 发布:linux ntp时间同步配置 编辑:程序博客网 时间:2024/06/06 11:02

一、自定义异常

(1)、自定义应用异常步骤:

a、新建一继承自Throwable或其子孙类的类。

b、添加构造方法(根据需要定义构造,通常在子类的构造中要调用从父类那儿继承过来的”同构构造“)。

c、在被调方法(callee)中使用throw抛出异常。

d、在主调方法(caller)中捕获处理异常。

代码实例:

a、b两个步骤:定义一个子类,并且对其添加构造方法(与父类同构构造)

package abnormal;public class MyTestException extends Throwable {/** *  */private static final long serialVersionUID = 1L;//去除MyTestException下面的黄线public MyTestException(){super();//自定义构造,与父类型同构构造}public MyTestException(String msg){super(msg);//通过super调用父类中的构造,其中参数是传给父类中的构造}}
c、创建一个被掉方法(callee)用于抛出异常

package abnormal;public class Test {public static void Callee() throws MyTestException{//Callee()仅仅是函数名,注意区分函数名与系统函数区别throw new MyTestException("扔出异常");}}

d、创建一个主调方法(caller)——即本例中的main()方法

package abnormal;public class Main {public static void main(String[] args) {//系统提示异常可以使用声明,也可以使用try{}catch{}try {Test.Callee();//这里主叫} catch (MyTestException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
或者:
package abnormal;public class Main {public static void main(String[] args) throws MyTestException {Test.Callee();//这里主叫}}

备注:

1、抛出异常代码所在的方法要加throws声明。

2、实例化对咬要用new关键字,new后面必须为具体对象

3、try{}catch{}中catch异常捕获类型为发生异常的类型,或者其父类型(向下兼容)。

try{}catch{}catch{//这里catch必须为上面catch异常捕获类型的父类型}final{//最终释放资源}
(2)、泛型:——应该是只针对集合元素来说的

普通泛型:< >这两个括号中放置引用类型。

通配泛型:“?”符号表示任意类型。

受限泛型:extends(上限,参数类型是T或者其子类)

    super(下限,参数类型是此类的超类)

声明:有如下类:Animal、Cat、Tiger、DongbeiTiger、GenericType。(各个类之间的继承关系如其自然分类)

1、上限约束:<? extends Animal>参数类型为Animal及其后代。向上限集合中添加元素时,需要将带添加对象转换成参数类型,但是参数类型是上限类型或器子孙类(不确定),所以无法添加元素。

{PS:a、子类型对象可以添加到父类型集合中——类型兼容。向下兼容父类型兼容子类型

b、<? extends Animal>表示Animal及其后代类型,上限约束不能通过该变量添加上限类型及其子类型的具体对象(只能添加NULL),可以赋值。

}

2、下限约束:<? super Animal>参数类型Animal类及其祖先(一直到Object类),向下限集合添加元素时,需要将待添加的对象转换成参数类型,此时统一按下限类型转换,因此可以添加下限类型及其子孙类型。(上面的向下兼容问题,父类可以兼容子类)

{PS:List<? super DongBerTiger> lst1 = new ArrayList<DongBeiTiger>();

<? super DongBerTiger>表示DongBeiTiger类及其祖先(一直到Object类)。}

3、使读写分离,读写授权:

A、添加数据可以理解为向集合中写数据——写数据时,用下限泛型。

B、获取数据可以理解为向集合读数据——读数据时,用上限泛型。

4、如何将“只写”泛型约束集合转换成“只读”:

List<? extends Animal> rs = Array.asList(results.toArray(new Animal[result.size()]));
如何将“只读”泛型约束集合转换成“只写”:
List<? extends Animal> rs = Array.asList(results.toArray(new Animal[result.size()]));
5、写出所有代码???

(3)、文件I/O系统:

1、以 C:\Program Files\Java\jdk1.8.0_25为例:

a、绝对路径:从盘符开始写的路径。

b、相对路径:相对于当前路径的路径

./ :当前目录

../ :上级目录

../../ :当前目录上级的上级目录

c、路径表达式:

2、文件的路径的获取

package exercise;import java.io.File;import java.io.IOException;public class Second {public static void main(String[] args) throws IOException {File dir0 = new File(".");//创建一个关联与当前工作目录的文件对象System.out.println(dir0.getPath());//获取对象构造时,传入的参数路径(new后面的?)System.out.println(dir0.getAbsolutePath());//路径表达式:获取当前工作目录的绝对路径+构造参数路径(或者user.dir+构造参数)System.out.println(dir0.getCanonicalPath());//获取路径表达式换算后的绝对路径——标准绝对路径}}
3、一个重要的API:System.getProperty()
package exercise;import java.io.File;import java.io.IOException;public class Second {public static void main(String[] args) throws IOException {System.out.println(System.getProperty("java.io.tmpdir"));//程序临时目录System.out.println(System.getProperty("java.ext.dirs"));//程序拓展目录System.out.println(System.getProperty("java.file.separactor"));System.out.println(System.getProperty("user.dir"));//程序工作目录}}
4、文件(folder)文件操作:
package Folder;import java.io.File;public class folder {public static void main(String[] args) {File folder = new File("./src/myfile");//这行代码可以理解构造器System.out.println(folder.exists());if(!folder.exists()){//folder.mkdir();//一次创建一个目录文件夹folder.mkdirs();//一次创建多级文件目录}System.out.println(folder.exists());//判断文件是否存在System.out.println(folder.delete());//删除的是最子级的文件System.out.println("==============");File files = new File(".");//遍历时必须给出结点//遍历所有文件:for(String ele:files.list()){//ele为字符串System.out.println(ele);}System.out.println("==============");//遍历文件夹:只返回文件夹for(File ele:files.listFiles()){if(ele.isDirectory()){//ele是文件类型System.out.println(ele);}}}}
5、
package Folder;import java.io.File;import java.io.IOException;public class FileMain {public static void main(String[] args) throws IOException {File file = new File("./src/text.txt");System.out.println(file.exists());System.out.println(file.createNewFile());//创建新文件System.out.println(file.exists());if(file.delete()){System.out.println("文件删除成功");}file.exists();}}

6、文件复制:

a、Java垃圾回收机制:Java虚拟机会自动扫描内存,释放其中没有引用的内存。

b、变量(引用类型、地址)存在栈内存中,其值是存在堆内存里面的。这两个模块中存在引用,当程序运行结束,该引用消除,栈内存自动释放,堆内存中的内容是由Java虚拟机进行垃圾回收。

c、文件I/O流中时堆内存会有两个引用一个是I/O流的引用,还有一个是磁盘文件与堆内存的引用。前一个引用自动消除,后一个引用需要我们手动消除。

d、操作物理文件要先建立连接

e、文件复制代码:

package Folder;import java.io.*;import java.nio.channels.FileChannel;public class FileCopyMain {public static void main(String[] args) {FileInputStream fis = null;//文件输入流变量FileOutputStream fos = null;//文件输出流变量FileChannel fcIn = null;//输入流管道FileChannel fcOut = null;//输出流管道try{fis = new FileInputStream("./src/myFile/src.txt");//复制源:具体到文件名及其类型fos = new FileOutputStream("./src/myFile/dest.txt");//复制目标fcIn = fis.getChannel();fcOut = fos.getChannel();fcIn.transferTo(0, fcIn.size(), fcOut);//动力泵}catch(IOException exception){System.out.println(exception.getMessage());}finally{//必须显示关闭,垃圾回收器才能收回对象的内存(托管资源与非托管资源)if(null != fcOut){try{fcOut.close();}catch(IOException ex){}}if(null != fcIn){try{fcIn.close();}catch(IOException ex){}}if(null != fos){try{fos.close();}catch(IOException ex){}}if(null != fis){try{fis.close();}catch(IOException ex){}}}}}


0 0