java高级部分(五)

                                               异常

  不抗力因素----->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 异常类名() :匿名对象的方式)

  throwsthrow的区别?

  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;
		}
	}
}


猜你喜欢

转载自blog.csdn.net/m0_37167369/article/details/80326682