异常处理和file类

IO流

用来处理设备之间的数据传输,上传文件和下载文件

输入输出流,用于设备之间的数据传输

File表示的是IO流将来要操作的文件。

异常

异常就是java程序在运行过程中出现的错误。

Throwable  问题
Erro  错误,属于严重性问题
Exception   异常,属于一般性问题   可分为运行期异常和编译期异常。
运行期异常:RuntimeException及其子类 运行期异常我们自己可以解决,也可不不解决(ArithmeticException 除数为0的异常),对于运行期异常,我们自己没有处理就交由JVM去处理,JVM的默认处理方式是打印详细的异常信息,然后退出虚拟机。如果我们觉得JVM机的处理不够好,可以自己去捕获这个异常,自己来处理。

异常处理的两种方式

try…catch…finally
throws



try...catch处理异常的基本格式
	
	try	{
		可能出现问题的代码 ;
	}catch(异常名 变量名){
		针对问题的处理 ;
	}finally{
		释放资源;
	}
	
	变形格式:
		try	{
			可能出现问题的代码 ;
		}catch(异常名 变量名){
			针对问题的处理 ;
		}
	
注意事项:
  1. try中的代码越少越好
  2. catch中要做处理,哪怕是一条输出语句也可以,不能空处理,也不能将异常信息隐藏。
try…catch的方式处理多个异常

 try {
 可能出现问题的代码 ;
}catch(异常名1 变量名1){
 对异常的处理方式 ;
}catch (异常名2 变量名2){
  对异常的处理方式 ;
}....
注意事项:
  1. 能明确变量类型的尽量明确,不要用大的来处理
  2. 捕获多个异常的时候,大的异常放前面,平级的前后无所谓。
针对多个异常的处理
针对多个catch的变形格式
try {

 可能出现问题的代码 ;

}catch(异常名1 | 异常名2 | ....   变量名){

对异常的处理方案 ;

}
好处:简化了代码
弊端:对多个异常的处理方式是一致的
instance of   判断其左边对象是否是其右边类的实例。返回布尔类型的值。
注意事项:
  1. 多个异常之间的只能是平级关系,不能出现子父类的继承关系。
  2. 处理方式是一致的

编译期异常和运行期异常的区别

所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常。

编译时异常:JAVA程序必须显示处理,否则程序就会发生错误,无法通过编译。

运行时异常:无需显示处理,也可以和编译时异常一样处理。

Throwable的几个常见方法

getMessage():				获取异常信息,返回字符串。
toString():				获取异常类名和异常信息,返回字符串。
printStackTrace():		获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

throws的方式处理异常

定义功能方法时,需要把出现的问题暴露出来让调用者去处理,那么就通过throws在方法上标识。
throw用在方法的内部进行异常的抛出。抛出的异常一定是发生了得到异常
throws用在方法的后面进行抛出异常 ,抛出可能性异常。
throw的概述
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时就用throw把异常对象抛出。

throws和throw的区别

throws
		用在方法声明后面,跟的是异常类名
		可以跟多个异常类名,用逗号隔开
		表示抛出异常,由该方法的调用者来处理
		throws表示出现异常的一种可能性,并不一定会发生这些异常
		
throw
		用在方法体内,跟的是异常对象名
		只能抛出一个异常对象名
		这个异常对象可以是编译期异常对象,可以是运行期异常对象
		表示抛出异常,由方法体内的语句处理
		throw则是抛出了异常,执行throw则一定抛出了某种异常		

finally关键字

作用:finally里面做一些善后收尾工作。比如说释放资源,遇到异常 这个里面的代码也可以执行,前提是jvm没有退出。

被finally控制的语句体一定会执行,前提是jvm没有停止

final,finally和finalize的区别

final:是一个状态修饰符,可以用来修饰类,变量,成员方法。

  1. 被修饰的类不能被子类继承,修饰的变量其实是一个常量不能被再次赋值。
  2. 修饰的方法不能被子类重写。

finally:用try…catch…语句中,作用:释放资源,特点:始终被执行(JVM没有退出的情况之下)

finalize:Object类中的一个方法,用来回收垃圾。

如果catch语句中有return语句,finally语句会执行,不过是在return语句之前执行。
package com.itheima.demo17;



import java.util.InputMismatchException;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

try {
    System.out.println("请输入一个整数");
    int i = sc.nextInt();
    System.out.println(i);
}catch (InputMismatchException e){
    e.printStackTrace();
    return;
}finally {
    System.out.println("这里的代码执行了");
}
    }
}
//请输入一个整数
//as
//这里的代码执行了
//java.util.InputMismatchException
//	at java.util.Scanner.throwFor(Scanner.java:864)
//	at java.util.Scanner.next(Scanner.java:1485)
//	at java.util.Scanner.nextInt(Scanner.java:2117)
//	at java.util.Scanner.nextInt(Scanner.java:2076)
//	at com.itheima.demo17.Test2.main(Test2.java:14)
package com.itheima.demo17;



import java.util.Scanner;

//判断一个数是不是素数,素数:在大于1的自然数中,除了1和它本身之外,不再含有其他因数
public class Test3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个自然数");
        int n = sc.nextInt();

        for(int i=2;i<=n;i++){
            if(n%i==0){
                System.out.println("不是素数");
            }else{
                System.out.println("是素数");
            }
            break;
        }

    }

}

package com.itheima.demo17;
//判断100到200之间的素数:思路:用一个数分别区除2到sqrt()这个数,如果能整除,则白表明此数不是素数,反之就是素数。
public class Test4 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 101; i < 200; i += 2) {
            boolean flag = true;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag == true) {
                count++;
                System.out.println(i);
            }

        }
        System.out.println(count);
    }
}

自定义异常

在以后的开发过程中。我们可能会遇到各种问题,然而JDK不可能针对每一种问题给出具体的异常类,我们需要自己定义一些异常类。

//从银行取钱,发现钱不够,给出提示。

package com.itheima.demo17;

import java.util.Scanner;

public class Test5 {
    public static void main(String[] args)  {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的取款金额");
        double num = sc.nextDouble();
        qukuan(num);


    }

    private static void qukuan(double num)  {
        double money=100;
        if(num<=money){
            System.out.println("取款成功");
        }else{
            throw new NoMoneyException("余额不足异常");
        }
    }
}


package com.itheima.demo17;

public class NoMoneyException extends RuntimeException {
    public NoMoneyException(String 余额不足异常) {

    }
}

//请输入您的取款金额
//200
//\Exception in thread "main" com.itheima.demo17.NoMoneyException
// at com.itheima.demo17.Test5.qukuan(Test5.java:21)
// at com.itheima.demo17.Test5.main(Test5.java:11)

异常的注意事项

  1. 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类,或者子类不抛出异常也可以。
  2. 如果谷类抛出了多个异常,子类重写父类时,只能抛出相同的异常,或者他的子集,子类不能抛出父类没有的异常,或者子类不抛出异常也是可以的。
  3. 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。

也就是父类没有抛出异常,子类在重写父类方法时,不能抛出异常,如果父类抛出了异常。那么子类抛出和父类一样的异常,或者比父类小的异常。子类不能抛出父类没有抛出过的异常。

如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws

如果JDK没有提供对应的异常,需要自定义异常。

File类

概述:文件和目录路径名的抽象表现形式,这个类可以用来表示文件,也可以用来表示目录。

File类的构造方法
1. File file = new File("E:\\20151020\\day02\\day02总结.java") ;//根据一个路径得到File对象。
2. File file2 = new File("E:\\20151020\\day02" , "day02总结.java") ;//根据一个目录和一个子文件/目录得到File对象
3. File file3 = new File("E:\\20151020\\day02") ;
   File file4 = new File(file3 , "day02总结.java") ;//根据一个父File对象和一个子文件/目录得到File对象
创建功能

	public boolean createNewFile():创建一个新的文件 如果存在这样的文件,就不创建了
	public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
	public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录


绝对路径:包含盘符号的一个详细路径
相对路径:不含有盘符号的路径。
如果创建文件或者文件夹忘记写盘符路径,默认在项目路径下面。
删除功能
public boolean delete();删除文件或者文件夹 
删除文件夹时,这个文件夹是空文件夹,如果这个文件夹里面有文件,则不能删除。java总删除不走回收站,要删除注意该文件夹内不能包含文件或者文件夹。
package com.itheima.demo17;

import java.io.File;
import java.io.IOException;

public class Test6 {
    public static void main(String[] args) throws IOException {

        File file = new File("C:\\Users\\Administrator\\Desktop", "px.txt");
        boolean b = file.createNewFile();
        System.out.println(b);
        boolean b1 = file.delete();
        System.out.println(b1);
    }
}
//false
true
//删除多级目录

package com.itheima.demo17;



import java.io.File;

public class Test7 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\px");
        boolean b = delete(file);
        System.out.println(b);
    }

    private static boolean delete(File file) {
        if(file.exists()&&file.isDirectory()){
            String[] list = file.list();
            for (String s : list) {
                File file1 = new File(file, s);
                delete(file1);

            }

        }
        return file.delete();

    }
}
File类的重命名功能
  1. public boolean renameTo(File dest):把文件重命名为指定的文件路径
    
    注意事项:
    1.如果原来的文件和传入的这个文件是同一个路径,则就是改名
    2.如果原来的文件和传入的这个文件不是同一路径,就会发生剪切,把源文件剪切到传入的这个文件路径下面。
    
判断功能:
public boolean isDirectory():	判断是否是目录
public boolean isFile():	判断是否是文件
public boolean exists():	判断是否存在
public boolean canRead():	判断是否可读
public boolean canWrite():	判断是否可写
public boolean isHidden():	判断是否隐藏
public boolean isAbsolute(); 判断是否使用的是绝对路径


获取功能:
public String getAbsolutePath():	获取文件的绝对路径,返回的是字符串形式
public String getPath():		获取相对路径
public String getParent()   返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。返回的是字符串形式。
public File getParentFile()  返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 返回的是file类型
public long getTotalSpace()  返回此抽象路径名指定的分区大小。 返回总容量 单位字节,获取磁盘的总空间大小,单位是字节。
public long getFreeSpace()   返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节。,获取磁盘的剩余空间,
public String getName():		获取文件名
public long length():			获取文件的大小,单位是字节
public long lastModified():		获取最后一次的修改时间,毫秒值
public String[] list():			获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles():		获取指定目录下的所有文件或者文件夹的File数组 
package com.itheima.demo17;

import java.io.File;

public class Test8 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        long totalSpace = file.getTotalSpace();
        System.out.println(totalSpace);
        long freeSpace = file.getFreeSpace();
        System.out.println(freeSpace/1024/1024/1024.0+"GB");

    }
}

package com.itheima.demo17;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test9 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\课后");
        long l = file.lastModified();
        Date date = new Date(l);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:MM:dd");
        String format = dateFormat.format(date);
        System.out.println(format);


    }
}
输出指定目录下指定后缀名文件名
判断E盘目录下是否有后缀名为.png的文件,如果有,就输出该文件名称
        分析:
        a: 把E:\\demo这个路径封装成一个File对象
		b: 获取该路径下所有的文件或者文件夹对应的File数组
 		c: 遍历这个数组,进行判断
 		
 		
 		
 		package com.itheima.demo17;

import java.io.File;

public class Test10 {
    public static void main(String[] args) {
        File file = new File("E:\\图片");
        String[] list = file.list();
        for (String s : list) {
            File file1 = new File(file, s);
            if(file1.isFile()&&file1.getName().endsWith(".png")){
                System.out.println(s);
            }

        }


    }
}
//中心主题.png
文件名称过滤器

概述:

public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
分析:
把E:\\demo这个路径封装成一个File对象
获取所有的以.png结尾的文件数组		(相当于过滤)
遍历数组


package com.itheima.demo17;

import java.io.File;
import java.io.FileFilter;

public class Test11 {
    public static void main(String[] args) {
        File file = new File("E:\\图片");
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                boolean b = pathname.isFile() && pathname.getName().endsWith("png");
                return b;
            }
        });
        for (File file1 : files) {
            System.out.println(file1.getName());
        }


    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值