异常
不抗力因素----->error: 属于严重问题 内存溢出了 (加载页面中大量图片的时候,程序会挂掉---使用第三方的框架去处 理:ImageLoader)
异常:
编译时期异常:只要出现的不是运行时期异常,统称为编译时期 日期的文本格式---解析 java.util.Date类型:ParseException:解析 异常
编译时期异常:开发者必须处理!
运行时期异常:RuntimeException
编译通过了,但是开发者代码不严谨(NullPointerExceptino等等...)
异常的处理分为两种:
1)try...catch...finally (标准格式) :捕获异常
2)throws ... 抛出异常
变形格式...
try...catch...
try...catch...catch...
catch....
try{
一些代码
try里面的代码越少越好
代码包含了可能会出现问题的代码
}catch(异常类 异常类对象){
try出现异常了,描述的异常刚好就是catch的异常类,就会执行catch里面代码
throw:表示也是抛出异常,抛出的一个异常对象 (throw new 异常类名() :匿名对象的方式)
throws和throw的区别?
throws:也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间逗号开
举例:
public void show() throws IoException,ClassNotFoundException{...}
在方法上抛出,由调用者处理
它表示抛出异常的可能性
throw:抛出的一个异常对象
在语句体中抛出的,由语句体进行处理
它表示抛出异常的肯定性
try...catch...finally
finally语句体是一定会执行的,除非是Jvm退出了
如果catch里面有return 语句, finally中代码是一定会执行的,是在return前
异常中的注意事项:
子类继承父类的时候的注意事项
1)子类重写父类的方法的时候,子类的方法的抛出的异常必须要么是父类的方法异常一样,要么是父类方法异常的子类
2)子类重写父类方法的时候,如果父类中的这个方法没有抛出异常,那么子类重写的这个方法也不能抛出异常,只能try...catch
Jdk7以后出现另一种方式处理多个异常
try{
可能出现问题的代码;
}catch(异常类名1 | 异常类名2 |... 对象名){
处理异常
}
int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; try { //可能有问题 System.out.println(a/b); System.out.println(arr[3]); }catch(ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println("程序出问题了..."); } }
标准格式 try{ ... }catch(异常类 对象){ // 异常处理 }
执行try里面的代码 ,如果出现了问题,它会通过代码的问题创建一个异常对象,然后通过异常对象和catch里面的异常 类是否一致
如果一致的情况,就会出现catch里面的代码,执行Throwable里面的方法
public String getMessage() :消息字符串
public String toString(): 异常的简短描述 ":
":由冒号和空格组成
public void printStackTrace():返回值void 直接调用, 包含了消息字符串,还有": "
信息描述,具体出现异常的代码定位以及定位的源码上
public class ExceptionDemo { public static void main(String[] args) { /*int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; try { System.out.println(a/b); System.out.println(arr[3]); }catch(ArithmeticException e) { System.out.println("除数不能为空"); }catch(ArrayIndexOutOfBoundsException e) { System.out.println("访问了数组中不存在的脚标"); }catch(Exception e) { System.out.println("程序出问题了...."); }*/
编译时期异常和运行时期异常的区别?
编译时期:开发者必须进行显示处理,不处理,编译不能通过,
运行时期异常:无需进行显示处理,可以像编译时期一样进行处理
处理异常的第二种方式:使用throws 抛出异常 (跟在方法的后面)
xxx 返回值 方法名() throws 异常类名{
}
private static void method2() throws ParseException { String str = "2018-5-12" ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ; Date d = sdf.parse(str) ; //编译时期异常 System.out.println("d:"+d); }
File类
File类:表示文件或者目录的路径的抽象表现形式. IO流就是对文件进行操作的
绝对路径:c:\\xxx\\xxx.txt
相对路径:a.txt
File的三种创建方法:
public File(String pathname):表示pathname的抽象路径表现的形式 (开发中使用这种方式)
public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
public File(File parent, String child):根据一个file对象和一个文件路径来构造File实例
跟创建相关的功能:
public boolean createNewFile():创建文件,当文件不存在的时候,创建此抽象路径下的文件
public boolean mkdir():创建一个文件夹,如果文件夹存在,不创建
public boolean mkdirs():创建文件夹,如果父目录不存在,会创建此目录
注意:
如果创建一个文件/目录,没有写盘符的时候,会创建在当前项目路径下
import java.io.File; import java.io.IOException; public class FileDemo3 { public static void main(String[] args) throws IOException { File file = new File("E:\\aaa\\bbb\\ccc"); File file1 = new File(file,"test.txt"); file1.delete(); file.delete(); File file2= new File("aa\\bb\\cc"); file2.mkdirs(); File file3 =new File(file2,"test.txt"); file3.createNewFile(); } }
删除功能:
public boolean delete() :删除文件或者文件夹(目录不能是空的) :逐一删除文件或者目录的
File 的重命名功能:
public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。
如果路径名一致的情况,那么只是重命名
如果两次路径名称不一致,那么不只是重命名,并且剪切
import java.io.File; public class FileDemo4 { public static void main(String[] args) { File file= new File("aa\\bb\\cc\\test.txt"); File newfile=new File("aa\\bb\\cc\\t.txt"); file.renameTo(newfile); File newfile2=new File("aa\\bb\\cc\\t.txt"); File newfile3=new File("E:\\test.txt"); newfile2.renameTo(newfile3); } }
File类的判断功能:
public boolean isDirectory():判断是否是文件夹
public boolean isFile() :判断是否是文件
public boolean canRead(): 是否可读
public boolean canWriter():是否可写
public boolean exists() :是否存在
public boolean isHidden():是否是隐藏文件
File类的获取功能:
public String getAbsolutePath():获取抽象文件的绝对路径
public String getPath():获取相对路径的字符串
public String getName()返回由此抽象路径名表示的文件或目录的名称
public long length()返回由此抽象路径名表示的文件的长度。
public long lastModified():文件最后一次被修改的时间(时间毫秒值)
import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class FileDemo6 { public static void main(String[] args) throws IOException { File file =new File("aa\\bb\\cc\\t.txt"); file.createNewFile(); System.out.println(file.getAbsolutePath()); System.out.println(file.getName()); System.out.println(file.getParent()); System.out.println(file.getPath()); System.out.println(file.getAbsoluteFile()); System.out.println(file.getParentFile()); System.out.println(file.length()); System.out.println(file.lastModified()); Date date=new Date(file.lastModified()); String s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); System.out.println(s); } }
需求:获取e盘下所有的文件夹以及文件的名称
File的高级功能:
public String[] list() :获取当前某个路径下的所有的文件夹以及文件名称的字符串数组
public File[] listFiles() :获取当前某个路径下所有的文件夹以及文件的File数组
FilenameFilter:一个接口: 文件名称过滤器
boolean accept(File dir, String name)测试指定文件是否应该包含在某一文件列表中。
文件是否包含在文件列表中,取决于返回值,true;false表示不包含
import java.io.File; import java.io.FilenameFilter; public class FileDemo9 { public static void main(String[] args) { File file = new File("e:"); String [] str=file.list(new FilenameFilter() { @Override public boolean accept(File arg0, String arg1) { return new File(arg0,arg1).isFile()&&arg1.endsWith(".txt"); } }); for(String s:str) { System.out.println(s); } } }
IO流
IO:在设备和设备之间的一种数据传输!
IO流的分类:
按流的方向分:
输入流: 读取文件(e:\\a.txt):从硬盘上文件读取出来后输出这个文件的内容
输出流: 写文件:将e:\\a.txt 内容读出来--->写到f盘下
按数据的类型划分:
字节流
字节输入流:InputStream :读取字节
字节输出流:OutputStream :写字节
字符流
字符输入流:Reader :读字符
字符输出流:Writer :写字符
需求:在当项目下输出一个文件,fos.txt文件(文本文件)
只要是文本文件,优先采用字符流,字符流在字节流之后出现的
使用字节流进行操作
无法创建字节输出流对象:OutputSteam :抽象类,不能实例化
又学习过File类,并且当前是对文件进行操作,子类:FileOutputSteam进行实例化
File+InputStream
File+OutputStream
FileXXX (FileReader)
FileXXX (FileWriter)
开发步骤:
1)创建字节输出流对象
2)写数据
3)关闭资源
关于字节输出流写数据的方法
public void write(int b):一次写一个字节
public void write(byte[] b) :一次写一个字节数组
public void write(byte[] b, int off,int len):一次写一部分字节数组
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class IODemp2 {
public static void main(String[] args) throws Exception {
FileOutputStream f=new FileOutputStream("E:\\test.txt",true);
f.write("\r\n".getBytes());
for(int i=0;i<10;i++) {
f.write(("hello"+i).getBytes());
f.write("\r\n".getBytes());
}
f.close();
}
}
需求:输出文本文件,给文本文件中添加一些数据
问题:
写一些数据,这些数据并没有换行,如何实现换行的效果...
针对不同的操作系统,里面的换行符合不一样
windows: \r\n
Linx:\n
mac:\r
一些高级记事本针对任意的换行会有换行的效果
问题:如何末尾追加数据呢
public FileOutputStream(File file, boolean append):指定为true,末尾追加数据
需求:去读取当前项目下的fis.txt这个文件内容,将文件的内容输出在控制台上
InputStream抽象类:字节输入流
FileInputStream
构造方法:
public FileInputStream(String name)
开发步骤:
1)创建字节文件输入流对象
2)读数据
3)释放资源
读数据方式:
public abstract int read():一次读取一个字节
public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
import java.io.FileInputStream; import java.io.FileNotFoundException; public class IODemo5 { public static void main(String[] args) throws Exception { FileInputStream f=new FileInputStream("E:small08.jpg"); int len=0; byte[] b=new byte [1024]; while((len=f.read(b))!=-1) { System.out.println(new String(b,0,len)); } } }
复制文本文件:
将当前项目下的a.txt文件的内容读取出来,复制到b.txt文件中
源文件: a.txt ---> 读取文件的内容---->FileInputStream
目的地文件: b.txt----> 输出文件 --->FileOutputStream
本身读写操作:
读取一个字节,写一个字节,针对不会出现中文乱码的问题..
复制文件:
源文件:c:\\a.txt
目的地文件:d:\\b.txt
源文件---->FileInputStream 读取操作
目的地文件--->FileOuputStram 写入操作
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class IODemo6 { public static void main(String[] args) throws Exception { FileInputStream fis=new FileInputStream("a.txt"); FileOutputStream fos=new FileOutputStream("b.txt"); int by=0; while((by=fis.read())!=-1) { fos.write(by); } fos.close(); fis.close(); } }
递归
递归:只的是方法调用方法本身的一种现象
注意:
Math类:max() 方法 Math.max(10,Math.max(15,20)); 方法嵌套
举例
方法递归:
public void show(int n){ if(n<0){ System.exit(0) ;//jvm退出了 } System.out.println(n) ; show(n--) ; }
方法递归的三个必要条件:
1)方法递归必须有出条件
2)必须满足一些规律
3)一定要写方法
注意:构造方法不存在方法递归的
需求:求5的阶乘
5! = 5 4 3 21
5! = 5 4!
方式:
1)普通for循环
2)用递归的方式去写
1)方法递归必须有出条件
2)必须满足一些规律
3)一定要写方法
public class IoDemo7 { public static void main(String[] args) { System.out.println(diGui(5)); } private static int diGui(int n) { if(n==0||n==1) { return 1; }else if(n>1) { return n*diGui(--n); }else { return -1; } } }