您的位置:首页 > 编程语言 > Java开发

JAVA语言基础:异常的处理和I/O系统

2017-09-23 00:00 253 查看
异常处理

平日里我们说的异常不是说你语法写错了。那种错误我们称为编译错误。

编译错误就是说你没有遵守java中写代码的规范

异常是运行的时候出现的错误。

异常通常用来提醒调用方法(api)的人告诉他某个地方需要处理一个潜在的错误。同时异常也给调用方法的人一个补救程序错误的机会

异常:Throwable是一个接口(类)它下面有2个子类 Error和Exception 【一颗色坡醒】

其中的Error是严重错误。这种错误一般不管的,也可以说不用处理这类错
误。

其中Exception是我们可以处理的异常错误。也可以说是我们异常中的顶级类我们所能控制,所能修复,所能处理异常的顶级异常。

可以处理的Exception我们又分2类 一种是RuntimeException Exception的子类运行时异常 它属于不受检查的异常。往往会是语法问题。是写这个代码的人要去修改的,而不是调用者来修改。英文叫:unchecked

另一种是其他错误。也就受检查的异常。必须处理。英文:checked异常这些异常与业务相关。比如说给钱,你给少了就会提示异常。

RuntimeException 发音 [一颗色pe醒]下面有子类:NullPointerException和IndexOutOfBoundsException

checked 【恰可的】异常怎么处理呢?非常重要。

通过try catch语句捕获和处理 try试一试 catch捕获抓的意思。

try{}中填写可能运行错误的代码
catch()中填写将要捕获那个类型的异常。并且要把那个类型写上,还要在创建一个对象名。

比如:catch(NullPointerException ne)

把异常捕获后,程序就可以重新运行了。

try那里填写异常语句后。就会跳过try语句块不执行,直接到catch那里去。也就是说那里有错误就拖到try语句块中,有点像把这个错误代码关小黑屋意思。

有时候我们希望把异常的信息打印出来。那么我们直接在catch语句块中打印就行比如:

ne.printStackTrace();其中ne是上面NullPointerException的实例对象printStackTrace是方法。

上面说的是不受检查的异常,最上面我们说了这种异常其实不需要我们处理。不过我们try catch也可以,当是给我们练习

注意:不能单独使用try或者catch 一般来说都是一起使用。

异常要是不确定怎么处理捕获就可以抛出异常。关键字:throw 【死肉】。也可以说就是丢给其他人去处理。

throw new RuntimeException("你有问题");意思就是抛出一个异常

抛出来的异常在调用的时候不必用try catch来捕获处理。

受检查的异常就是开发工具或者说jdk会在你编写完一段代码的时候马上提示你这里有错误。这就叫受检查。

非受检查就是你代码没有提示错误,可是运行的时候才有错误,那种叫非受检查。

处理受检查异常就用try catch 语句

第二种可以使用抛出异常。

使用try catch语句的时候 catch可以有多层,catch的顺序是从子类到父类。

比如:try{
}catch(RuntimeException re){ 先子类

}catch(Exception ex){ 在父类
}

不可以catch相同的异常
try{
}catch(RuntimeException re){

}catch(RuntimeException e){ 代码错误
}

自定义异常。

一般来说我们会继承Exception及其子类 业务相关的异常

如何自定义异常呢?

新建一个类。接着继承extends Exception 这样就自定义一个异常了只要继承Exception就是一个异常

throw 和throws区别 前面是真的抛出异常 后者是告诉调用这段代码的人有异常

建一个方法写一个条件
if(i<100){
throw new Exception("数字太小");

}else{
System.out.println("符合条件");
}

finally关键字

通常和try catch一起使用

某些代码不会执行,可是我们希望执行、就需要finally 它代码块不管你前面能不能运行,反正它会运行。它的作用是做资料释放清理的工作

try 可以和finally一起用 多线程同步 加锁在释放

控制台输入:Scanner unli包下一个类。等你输入一个东西然后在接收

System.out.println("输入一个数字");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
System.out.println("你输入的数字是:"+a);

return 表示程序执行到这里就结束。如果遇到finally会来执行一次,如果有return就会在finally这里的return跳出去。

I/O系统 就是输入和输出的简称 这个系统离不开文件File类

File类专门用来表示某类文件或者文件夹。

I/O是input/output的简称,表示输入输出。用于数据流的控制。

我们通过I/O系统实现文件的读写与传输,网络数据流的处理等。

现代软件系统不可或缺的一个功能。

I/O下面的类File

这个类用于处理文件和文件夹的API.

我们可以new出一个file对象,里面有构造方法需要传入参数String型。
并且传入后就能知道你创建的这个对象是文件还是文件夹。可以传入已知的文件也可以传入 一个未知的文件或者文件夹路径。

例如:File file new File("这里传入某个文件夹或者文件的存储路径")

File file=new File("E:\lesson3.pptx"); 注意这里括号内传如的路径需使用\双斜杠

这个类有一些API如下:

file.isDirectory() 是否是文件夹
file.canWrite() 是否可写
file.canRead 是否可读
file.isFile() 是否是文件
file.lastModified() 得到文件或者文件夹的最后修改的时间 返回的值是毫秒。

我们如何把这个值转换成我们可以看懂的年月日格式呢?

通过util 包下面的Date类。

Date date=new Date;这里new了一个对象date就表示当前时间。
System.out.println(date);直接打印这个date

切忌在new对象的时候不要忘记最后加上()也就是调用父类构造方法。

SimpleDateFormat java.text包下的一个类

SimpleDateFormat si=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");

System.out.println(si.format(file.lastModified()));

这样就可以把毫秒的最后修改时间转换成我们通俗易懂的:2013年07月21日 02时04分13秒

is has开头的方法一般都会返回一个布尔值trun 和false

创建或者删除文件夹

首先也需要通过File类创建一个对象 ()中建立好路径输入一个文件夹的名称。接着对象调用mkdir方法运行就创建了一个文件夹。使用mkdirs方法可以创建文件夹里面的文件夹。

File file=new File("E:\我是张理斌");
file.mkdir();

File file=new File("E:\我是张理斌\我还是张理斌"); 最好用英文名
file.mkdirs();

mkdir只能在已知的目录下创建文件夹。而mkdirs可以在不存在的目录下创建文件夹使用mkdirs创建不存在盘符的文件夹。默认会创建在D盘。最好指定一个盘符 mkdirs用的最广泛。

file.delete();删除路径中最后的文件夹

创建或者删除文件

首先也需要通过File类创建一个对象 ()中建立好路径输入一个文件的名称。接着对象调用createNewFile();方法运行就创建了一个文件注意这里会遇到受检查异常,需要try catch或者抛出。

创建文件需要输入文件的后缀比如txt文件就需要这样输入lesson.txt

file.delete();删除路径中文件

列出文件夹下面的所有文件价和文件

list方法可以返回一个文件名的数组。内容是文件夹里面的文件夹名和文件名

listFiles方法可以返回文件夹下面的所有文件对象。

例如:

File file=new File("D:\Program Files");
String[]filearray=file.list(); 为什么用String因为文件夹目录下的文件夹名和文件名都是String类型的字符
for(String str:filearray){ 循环打印出文件夹下面的文件夹名字和文件名字
System.out.println(str);
}

打印出来的内容是数字到字母在到中文名

下面这段代码是一个:递归算法 什么是递归:一个方法内部再调用该方法.

public static void test(File file){
File[]file1=file.listFiles();
for(File str:file1){
if(str.isDirectory()){
test(str);
}else{
System.out.println(str.getAbsolutePath());
}
}

过滤 endwith方法 过滤后缀名 或者重写一个方法过滤文件

Java中Inputstream(输入流的顶级类或者说读取的顶级类,这是一个抽象类)对应reader及其之类都拥有read方法用于读取数据(字节和字符串)

java中outputstream(输出流的顶级类或者说写入的顶级类,这也是一个抽象类)对应writer及其子类都拥有write方法用于往某处写入数据

I/O包复制

使用时需要不同的API组合才可以发挥威力

Inputstream 下面有个常用的子类Fileinputstream子类可以帮助我们以字节为单位读取或者说输入文件。

File file=new File("文件路径")
InputStream infile=new Fileinputstream(file); 这里传入一个File对象。或者说传入一个数据源。

这里就通过file对象构造出一个Fileinputstream对象。

Inputstream是以字节为单位来读取的。我们要读取就得创建一个字节数组,让数据流到这里来。字节byte关键字

下面的代码就是读取一个txt文件的过程。

File file=new File("F:\\new.txt");
InputStream in=new FileInputStream(file);
byte[] bytearray=new byte[1024];
int length=in.read(bytearray);
while(length!=-1){
String str=new String(bytearray, 0, length);
System.out.println(str);
length=in.read(bytearray);
}
in.close();  最后关闭流

通过字符的方式输入和输出

Writer和Reader 支持Unicode字符

使用缓冲器来包装Reader和Writer 可以存储多个字节和字符

使用缓冲器可以让这个API来识别到底那一句话是这一行的结尾

BufferedWriter 【八fe的】 这个类的上面是Writer父类

\这是右斜杠 在写入内容的时候最后加上“\n”就可以起到换行的效果

/这是左斜杠

newLine这个方法可以直接换行。

使用缓冲器必须使用br.close();方法否则无法写入成功

I/O有些难的地方在于,他在写入和读取数据的时候分字节和字符。

然后就是它的API。

总结:

I/O 输入(读取) 输出(写入)

顶级抽象类 InputStream OutputStream

如果你的数据源是File 那么就对应File的InputStream和OutputStream

FileWriter 字符输出

FileReader 字符输入

为了更好的读取换行写入换行我们使用

BufferReader 包装FileReader

BufferWriter 包装FileWriter

顶级类 InputStream 这是个抽象类它下面的子类有FilterInputStream它的下面有BufferedInputStream

通过BufferWriter和BufferReader实现一个文件的读取同时把读取的文件写入到新建的文件中看下面的代码:

File file=new File("F:\\zlb.txt");
file.createNewFile();
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
bw.write("JAVA语言真难学fgk");
bw.newLine();
bw.write("学费真贵");
bw.newLine();
bw.write("学出来能找到工作不?");
bw.close();
BufferedReader br = new BufferedReader(new FileReader(file));
String str = br.readLine();

File file1 = new File("F:\\zlb2.txt");
file1.createNewFile();
BufferedWriter bw1 = new BufferedWriter(new FileWriter(file1));
while (str != null) {
bw1.write(str);
bw1.newLine();
str = br.readLine();
}
br.close();
bw1.close();

}

}

写 是输出 读 是输入

你可以把写 想象成一只圆珠笔的笔芯 在我们写字的时候 笔芯里面的墨 就输出到本子上面

读 你可以想象成一个吸管 或者可以把读说出是 吸 读什么东西 吸什么对面 就是输入 吸入方便记忆
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java