黑马程序员--Java基础--05--IO流1
来源:互联网 发布:php 爬虫代码 编辑:程序博客网 时间:2024/06/15 23:59
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.异常处理:
1.JVM默认处理异常的方式:
1).发现异常;
2).识别异常;
3).封装异常对象:在类库中找到对应的"异常类",并实例化此类的对象
4).向控制台打印异常信息:
Exception in thread "main" java.lang.ArithmeticException: / by zeroat cn.itcast.demo15_JVM默认是如何处理异常的.Demo.main(Demo.java:7)
5).将我们的程序结束;
2.基本语法:try...catch
1).try{
//可能会出现异常的代码
}catch(异常类型 变量名){
//如果出现异常了,告诉JVM怎么做--JVM会执行这里面的代码;
//一般情况下我们在这里做什么:
1.开发阶段:可以打印异常异常信息,有助于调试;
2.程序交付使用后:将错误信息写入日志文件;后期供开发人员维护升级使用;
}
2). 异常处理机制的执行流程:
1.执行try中的代码
2.如果没有发生异常,执行完try后,不执行catch,跳过catch直接执行后续语句;
如果发生异常:
A.JVM先识别异常;
B.JVM封装异常;
C.看我们的代码,有没有相应的catch语句,而且要匹配catch中的"异常类型";
D.如果匹配到,执行此catch种的代码,执行完毕后,执行catch的后续语句;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个整数:");try{int n = sc.nextInt();System.out.println(n);}catch(InputMismatchException e){sc = new Scanner(System.in);}System.out.println("程序结束");}}</span>
3.多catch:try...catch...catch...catch
1).一段代码可能会产生多种异常;
2).我们可以写一个try语句,后面跟多个catch语句,表示捕获多种异常;
try{
//可能会出现异常的代码
}catch(异常类型1 变量名){
//如果发生"异常类型1"异常时,会执行这里的代码
}catch(异常类型2 变量名){
//如果发生"异常类型2"异常时,会执行这里的代码
}catch(异常类型3 变量名){
//如果发生"异常类型3"异常时,会执行这里的代码
}
3).注意:
多catch种的异常类型,可以是"同级别"异常类型,不分先后顺序,也可以是"子父"异常类型;
如果是"子父关系"的异常类型,父级别的异常类型,一定要放在catch列表的末尾;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{int a = 10;int b = 0;System.out.println(a / b);int[] array = {14,2,43};System.out.println(array[3]);String str = null;System.out.println(str.length());//后边还有其他代码,可能产生其它异常;但不知道是具体什么异常了}catch(ArithmeticException e){System.out.println("除数不能为0!");}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界!");}catch(NullPointerException e){System.out.println("空指针!");}catch(Exception e){System.out.println("发生未知异常,请与系统管理员联系!");}}}</span>
4.JDK7的多catch语句:try...catch(异常类型1 |异常类型2 | 异常类型3 e)
注意:一定要是"平级关系",不能是"子父关系"
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{int a = 10;int b = 0;System.out.println(a / b);int[] array = {14,2,43};System.out.println(array[3]);String str = null;System.out.println(str.length());//后边还有其他代码,可能产生其它异常;但不知道是具体什么异常了}catch(ArithmeticException | ArrayIndexOutOfBoundsException | NullPointerException e){System.out.println("空指针!");}catch(Exception e){}}}</span>
5.Throwable的常用方法:
String getMessage():获取异常信息,返回字符串。
String toString():获取异常类名和异常信息,返回字符串。
void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。在调试时,此方法很有用;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {int a = 10;int b = 0;try{//System.out.println( a / b);fun1();}catch(ArithmeticException e){//System.out.println("getMessage() : " + e.getMessage());//System.out.println("toString() : " + e.toString());e.printStackTrace();}}private static void fun1() {fun2();}private static void fun2() {fun3();}private static void fun3() {System.out.println(10 / 0);}}</span>6.方法内处理异常的方式一_throws语句;
1.总原则:在方法内如果发生异常情况,尽量不要"处理",而是抛给调用者去处理;
2.抛出的方式有两种:
1).在方法声明时,在形参列表之后,使用throws关键字,后面跟一个,或多个异常类型名称;
抛出的异常类型:
A.运行时异常:调用方 可以不捕获,编译能通过。但是如果真的发生异常,JVM仍然是结束掉程序;
B.非运行时异常:调用方法必须捕获,或者抛出;
2).在方法内部,手动的"抛出"一个"异常对象";使用关键字:throw
抛出的异常类型:
A.运行时异常:1.方法可以不声明throws此类型异常;2.调用方可以不捕获;
B.非运行时异常:1.方法声明处,必须显示的throws此类型异常;2.调用方必须捕获或者抛出;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{//System.out.println(getMax(null));//getMax()方法抛出的是:运行时异常。调用方可以不捕获,编译能通过;//System.out.println(getMax2(null));System.out.println(getMax3(null));}catch(NullPointerException e){System.out.println("异常信息:" + e.getMessage());}String str = "2015-09-20";try {Date date = stringToDate(str);//stringToDate()方法抛出的是:非运行时异常。调用方必须捕获,或者抛出;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static int getMax(int[] array) throws NullPointerException,ArithmeticException,ArrayIndexOutOfBoundsException{int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}//将String转换为Datepublic static Date stringToDate(String str) throws ParseException{SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(str);return date;}//测试throwpublic static int getMax2(int[] array){try{int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}catch(NullPointerException e){e = new NullPointerException("大哥,你给我传了一个空指针!你这是要害我啊!!");throw e;}}public static int getMax3(int[] array) {if(array == null){throw new NullPointerException("空指针异常!");}int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}}</span>
7.throws和throw的区别;
throws和throw都是用于处理方法内的异常的;而且都是抛出;
throws :
1).用在"方法声明处";它表示:此方法"可能"会抛出某种类型的异常;
2).后面跟的是"异常类型名称",而且可以有多个;
throw:
1).用在"方法体内";它表示:真正的抛出一个"异常对象";
2).后面跟的是"异常对象",只能有一个;
8.到底如何处理异常;
1).在main()方法内,使用try_catch语句,捕获并且处理异常;
2).在某个方法内:可以捕获,但不要处理异常,一般都是抛给调用者处理:
抛出的方式有两种:
A.throws:
B.throw:
9.finally语句;
try{
//可能会出现异常的代码
}catch(异常类型 变量名){
//如果出现异常,会被执行的代码;
}finally{
//无论是否出现异常,都会被执行的代码;
//一般,这里用来释放一些很占用空间的"资源";
}
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {fun();}public static void fun(){try{int a = 10;int b = 10;System.out.println(a / b);}catch(Exception e){System.out.println("catch");}finally{//无论是否发生异常,这里的代码都会被执行的到;System.out.println("finally");}}}</span>10.final_finally和finalize的区别;
final:最终的,可以修饰:
类:最终类,不能被继承
方法:最终方法,不能被重写
变量:拥有最终的值,只能被赋值一次,之后不能被更改:
基本类型:值不能更改;
引用类型:地址不能被更改;
finally:异常处理的关键字。无论是否出现异常,都会被执行的代码块;
finalize:Object类的一个方法。当垃圾回收器回收此对象空间之前,会调用的一个方法;
11.finally中有return语句
<span style="font-family:Microsoft YaHei;font-size:14px;">finally中有return语句;public class Demo {public static void main(String[] args) {System.out.println(fun());}public static int fun(){int n = 10;try{n = 20;return n;//1.执行return语句,先将20缓存;2.执行finally;3.返回缓存中的值;}catch(Exception e){n = 30;return n;}finally{System.out.println("finally");n = 40;return n;}}}</span>
12.自定义异常;
1).Java类库中的异常类,不足以满足我们的要求;
2).有时候我们需要我们自己的异常类型:
例如:接收一个年龄值,我们业务上要求年龄值必须在:15--50之间;
3).自定义异常:
A.自定义类,继承自某个异常类,或者Exception
B.最好提供一个带String参数的构造方法,用于指定"异常消息";
C.注意:如果我们的异常类直接继承自Exception,那么我们的异常是:非运行时异常;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class AgeException extends Exception{public AgeException(){super();}public AgeException(String message){super(message);}}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">class Student{private int age;public void setAge(int age) throws AgeException{if(age < 15 || age > 50){//抛出异常throw new AgeException("年龄必须在15--50之间");}}}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {Student stu = new Student();try {stu.setAge(10);} catch (AgeException e) {System.out.println("异常了:" + e.getMessage());}}}</span>
13.重写父类方法时的异常处理;
父类方法不抛出异常:
子类:1.也可以不抛出;
2.可以抛出任何的运行时异常;
3.不能抛出任何的非运行时异常;
父类方法抛出运行时异常:
子类:1.可以不抛出任何异常;
2.可以抛出任何的运行时异常;
3.不能抛出任何的非运行时异常;
父类方法抛出非运行时异常:
子类:1.可以不抛出任何异常;
2.可以抛出任何的运行时异常;
3.不能抛出比父类更多的非运行时异常;
综上所述:
无论父类方法是否抛出任何类型异常:
子类:1.可以不抛出任何异常;
2.可以抛出任何的运行时异常;
如果父类抛出非运行时异常,子类不能抛出比父类更多的非运行时异常;
二.File类:
1.File类概述;
1).java.io.File(类):代表磁盘上的一个文件或目录:
2).此类的一个对象,可以获取文件的大小、绝对路径、是否可读、是否可写.....
3).构造方法:
public File(String pathname):使用一个String封装的目录构造一个File对象
public File(String parent,String child):使用父级目录和子目录构造一个File
public File(File parent,String child):使用File表示的父目录和String的子目录构造一个File
绝对路径:带盘符的全路径的文件名;
相对路径:指在当前项目运行的目录下;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("C:\\test\\test.txt");//使用绝对路径构造File file2 = new File("test.txt");//使用相对路径构造File file3 = new File("C:\\test","test.txt");//此对象跟file表示的路径相同;File file4 = new File("C:\\test");File file5 = new File(file4,"test.txt");}}</span>
2.File类创建功能;
创建功能
public boolean createNewFile():创建文件
public boolean mkdir():创建单级目录;
public boolean mkdirs():创建多级目录;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.IOException;public class Demo {public static void main(String[] args) {File file = new File("demo30.txt");try {System.out.println("创建文件:" + file.createNewFile());} catch (IOException e) {e.printStackTrace();}File file2 = new File("test\\aaaa");//file2.createNewFile();//建立的仍然是文件System.out.println("创建单级目录:" + file2.mkdir());File file3 = new File("test2\\aaa2\\bbb2\\ccc2");System.out.println("创建多级目录:" + file3.mkdirs());}}</span>
3.File类删除功能;
public boolean delete():用于删除文件,和"空目录":不走Windows回收站;
如果是多级目录,或者非空目录,一定要先清理目录下的所有内容后,才能删除,后边我们做练习会使用递归删除;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("demo30.txt");System.out.println("删除文件:" + file.delete());File file1 = new File("test");System.out.println("删除目录:" + file1.delete());}}</span>
4.重命名功能
public boolean renameTo(File dest)
相同目录:重命名文件;
不同目录:剪切,并重命名;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("C:\\test\\test.txt");//System.out.println("重命名文件:" + file.renameTo(new File("C:\\test\\myFile.txt")));System.out.println("重命名文件:" + file.renameTo(new File("myFile.txt")));}}</span>
5.File类的判断功能:
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():文件或目录是否存在
public boolean canRead():是否可读;
public boolean canWrite():是否可写
public boolean isHidden():是否隐藏;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("Myfile.txt");//对于文件名,这里和磁盘上的文件名不区分大小写;System.out.println("是否是一个目录:" + file.isDirectory());System.out.println("是否是一个文件:" + file.isFile());System.out.println("文件或目录是否存在:" + file.exists());System.out.println("是否可读:" + file.canRead());System.out.println("是否可写:" + file.canWrite());System.out.println("是否隐藏:" + file.isHidden());}}</span>
6.基本获取功能
public String getAbsolutePath():获取绝对路径;
public String getPath():获取File封装的路径;
public String getName():获取文件/目录的名称
public long length():获取文件/目录的大小;单位:字节
public long lastModified():获取文件/目录的最后修改时间;单位:毫秒
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;public class Demo {public static void main(String[] args) {File file = new File("myFile.txt");System.out.println("绝对路径:" + file.getAbsolutePath());System.out.println("File封装的路径:" + file.getPath());System.out.println("文件名:" + file.getName());System.out.println("文件大小:" + file.length() + " 字节");System.out.println("最后修改时间:" + file.lastModified() + " 毫秒");long time = file.lastModified();Date date = new Date(time);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = sdf.format(date);System.out.println("最后修改时间:" + str);}}</span>
7.高级获取功能
public String[] list():获取当前目录下所有的文件、目录的名称;
public File[] listFiles():获取当前目录下所有文件、目录的File数组
这两个方法区别:
1).第一个方法简单的返回了此目录下所有文件/目录的"名称";
2).第二个方法是将目录下的每个文件/目录又封装为一个File对象,并存到一个File[]数组中。
如果我们需要在获取后,对每个文件需要进一步的操作,可以使用此方法比较方便;
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {File file = new File("C:\\20150822");String[] fileArray = file.list();for(String s : fileArray){System.out.println(s);}System.out.println("-----------------------------------------------------");File[] fileArray2 = file.listFiles();for(File f : fileArray2){System.out.println(f.getAbsolutePath());}}}</span>
8.输出指定目录下指定后缀名的文件;
输出C:\\test\\所有的.java文件
1.封装初始目录:File file = new File("C:\\test");
2.获取目录下的所有的文件/目录的名称-->File[]数组
3.遍历File[]数组,分别判断每个File是否是文件:
是:判断是否.java结尾;
是:输出:
否:--
否:---
<p><span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;</span></p>
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {File file = new File("C:\\test");File[] fileArray = file.listFiles();for(File f : fileArray){if(f.isFile() && f.getName().endsWith(".java")){System.out.println(f.getAbsolutePath());}}}}</span>9.批量修改文件名称案例
将C:\\20150822\\day18下的所有的avi文件, 存储到:"c:\\20150822\\day18\\avi"目录下; 并且要将原文件名中的所有的"集合框架"字样去掉。
步骤:
1.封装原目录:
2.封装目标目录:
3.判断目标目录是否存在,如果不存在,则创建;
4.获取原目录下的所有的.avi文件:使用文件过滤器;
5.遍历所有.avi文件的数组:
1).获取每个avi文件的文件名;
2).将文件名中的"集合框架"字样去掉;
3).重命名到新目录;
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.FilenameFilter;public class Demo {public static void main(String[] args) {File srcFile = new File("C:\\20150822\\day18");File destFile = new File("C:\\20150822\\day18\\avi\\");//判断目标目录是否存在if(!destFile.exists()){destFile.mkdir();}//获取原目录下所有的.avi文件File[] fileArray = srcFile.listFiles(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {File file = new File(dir,name);if(file.isFile() && file.getName().endsWith(".avi")){return true;}return false;}});//遍历数组for(File f : fileArray){//获取原文件名String name = f.getName();//去掉集合框架字样name = name.replace("集合框架", "");f.renameTo(new File(destFile,name));}System.out.println("复制结束!");}}</span>10.文件过滤器
在File中还有两个list()和listFiles()的重载方法:
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter
<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.FilenameFilter;public class Demo {public static void main(String[] args) {File file = new File("C:\\20150822");String[] fileNameArray = file.list(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {//return false;//全不匹配//return true;//全部匹配//写我们自己的匹配逻辑//System.out.println("dir = " + dir + " name = " + name);File file = new File(dir,name);//我们需要确定这个File要是一个文件,所以要构造一个File对象if(file.isFile() && file.getName().endsWith(".java")){return true;}return false;}});for(String s : fileNameArray){System.out.println(s);}}}</span>
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
- 黑马程序员-----Java基础-----IO流-1
- 黑马程序员--Java基础--05--IO流1
- 黑马程序员-java基础 io字符流
- 黑马程序员-java基础 io字节流
- 黑马程序员--JAVA基础之IO流
- 黑马程序员JAVA基础-IO流
- 黑马程序员 Java基础 ---> IO流
- 黑马程序员 JAVA基础<五> IO流
- 黑马程序员-JAVA基础-IO流
- 黑马程序员 java基础回顾---IO流
- 黑马程序员 Java基础----IO流(2)
- 黑马程序员---java基础---5IO流
- 黑马程序员----Java基础之IO流
- 黑马程序员---Java基础总结--IO流
- 黑马程序员-java基础-IO流
- 黑马程序员--JAVA基础之IO流
- 黑马程序员-------java基础 IO流<一>
- 黑马程序员-----java基础IO流<二>
- iOS解析json
- 关于h264bitstream的bug修正及完善
- 0. elipse使用方法及技巧
- HDU 5493 Queue
- UDP(面向无连接)的socket编程
- 黑马程序员--Java基础--05--IO流1
- 常识判断-国情社情与时政
- java 的排序算法
- 浅谈Java中的hashcode方法
- Java静态内部类
- Linux下的Oracle编程技术
- Valid Palindrome
- 计算最大链路块
- mybatis3学习笔记之Mapper编程