IO流:
四个顶层抽象类:
字节流: 字节流可以操作任何数据,但是操作纯文本时容易出现乱码
OutputStream(字节输出流)----->FileOutputStream(具体操作类);
InputStream(字节输入流)----->FileInputStream(具体操作类);
字符流: 字符流用于操作纯文本数据
1. Reader(字符输入流)--->InputStreamReader(转换流:把字节流转化成字符流)--->FileReader(具体操作流)--->BufferedReader(高效流)
2. Writer(字符输出流)---->OutputStreamWriter(转换流:把字符流转化成字节流)--->FileWriter(具体操作流)--->BufferedWriter(高效流)
File类-->FileReader/Writer类-->outputStreamWriter/inputStreamReader类||BufferedWriter/BufferedReader类
File file = new File("路径");//File最常见的构造
FileReader fr = new FileReader(file);//普通流构造时里面放的是File类型的对象
BufferedReader br = new BufferedReader(fr)//高效流构造时里面放的是普通流
* BufferedReader高效字符流特殊方法
* public String readLine() 一次读一行,如果读到末尾返回null
* BufferedWriter高效字符流特殊方法
* public void newLine() 换行
异常体系:exception和Error都继承于祖类throwable,
exception又分为RunTimeException与非RunTimeException
异常的处理方式
父类没有的异常子类肯定没有,
捕获异常: try/catch
//单异常处理
try{
System.out.println(1/0);
}catch(ArithmeticException e) {
System.out.println("MDZZ!");
}
//多异常处理:(一次捕获,多个catch处理)先检测try中哪个出现了异常,然后执行对应catch中的语句,由于java是中断异常处理机制,所以直接执行下面的非异常处理机制的语句
try{
Dateparse= date.parse(s);
System.out.println(1/0);
}catch(ParseException e) {
System.out.println("这是parse异常");
e.printStackTrace();
}catch(ArithmeticException e){
System.out.println("这是数学异常");
System.out.println("MDZZ");
e.printStackTrace();
}
//控制台上输出的是:这是parse异常...................还有显示的位置
//上面的代码也可以修改成另一种形式(不通用)
try{
Dateparse= date.parse(s);
System.out.println(1/0);
}catch(ParseException e|ArithmeticException e) {//不可能两个异常都产生,最多只能产生一个异常,因为产生异常之后中断处理,就不会再执行try里面的语句了
System.out.println("这是parse异常");
e.printStackTrace();
}
声明抛出异常
publicvoidmethod()throwsParseException{//方法后面加throws+可能出现的异常,声明如果出现异常就将异常抛出,谁调用谁去处理异常,调用者也可以选择继续抛出,交给JVM来处理! 如果在定义方法是没有声明抛出,那么在方法中出现的异常会直接交给JVM处理!
String s ="2010-11-28";
DateFormat date =newSimpleDateFormat("yyyy-MM!dd");
Dateparse= date.parse(s);
System.out.println(1/0);
}
自定义异常:
定义格式:如果是编译期异常,则继承exception,如果是运行期异 常则继承RuntimeException,
注意:自定义异常需要手动抛出,使用throw抛出
1.创建异常对象:普通的创建对象
2.抛出异常:使用throw,结束之后表示产生了一个异常
3.处理异常:使用throws或者try/catch来处理
publicclassDemo {
publicstaticvoidmain(String[] args)throwsParseException {
Scanner sc =newScanner(System.in);
//自定义异常的练习
inti = sc.nextInt();
if(i<50>){
Over50 o50 =newOver50();
throwo50;//手动抛出异常
}
System.out.println("呵呵");
}
classOver50extendsRuntimeException{//定义了over50运行异常类
}
泛型
1.概述:用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递
2.特点: 泛型的使用只有在创建对象时,数据类型时才能够确定,在编译成class文件时会被擦除,在运行时期会被补偿
泛型类:直接在类名后加<变量,通常为E或者T>
使用:创建对象时确定类型
泛型方法:
//简单的将任意类型的一个t打印出来
publicvoidmethod(T t){
System.out.println(t.toString());
}
泛型接口:
定义格式:直接在接口后面加;
//定义泛型接口
publicinterfaceMyInterface{
publicabstractvoidmethod(T t);
}
//泛型接口的使用
1.定义类时,实现接口,此时将接口中的数据类型确定下来,这时的类是没有泛型的,其所有类型都已经确定下来了.
classDemo1implementsMyInterface{
publicvoidmethod(String s) {
}
}
2.定义类时,实现接口,此时接口中的数据类型还没有确定下来,这时的类也应该要有泛型,其所有类型要等创建对象的时候才能被定下来.
classDemo1implementsMyInterface{
publicvoidmethod(T t) {
}
}