一、异常处理
异常的抛出与捕捉:
程序运行出现异常时,程序将在出现异常的位置终止,不再继续执行下面的语句。也就是说,异常抛出后,如果不做任何处理,程序就会被终止。
捕捉异常:java语言的异常捕获结构由try、catch、finally三部分组成,try语句块存放的是可能出现异常的java语句,catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理解构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。
try{
//代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
finally{
//代码块
}
例:在项目中创建Take类,在主方法中使用try-catch语句块将可能出现的一唱豫剧进行异常处理
public class Take{
public static void main(String[] args){
try{
String str="lili";
System.out.println(str+"年龄是:");
int age=Integer.parselnt("20L");
System.out.println("age");
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("program over");
}
}
上面这段代码,因为将非数字的字符转化成int整型是不行的,所以会抛出异常,并且停止。但是在try-catch语句块里,程序仍然输出最后的提示信息,没有因为异常而终止。
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是在以下四种特殊情况下,finally块不会被执行
1、在finally语句块中发生了异常
2、在前面的代码中使用了System.exit()退出了程序
3、程序所在线程死亡
4、关闭cpu
在方法中抛出异常
若某个方法可能会发生异常,但不想再当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常
例:在项目中创建shoot类,在该类中创建方法pop(),在该方法中抛出NegativeArraySizeException异常,在主方法中调用该方法,并实现异常处理,代码如下:
public class shoot{
static void pop()throws NegativeArraySizeException{
int[] arr=new int[-3];
}
public static void main(String[] args){
try{
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop()方法抛出的异常");
}
}
}
pop()方法抛出的异常
运行结果如上
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
异常的使用原则
java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几个原则
1、在当前方法声明中使用try-catch语句捕获异常
2、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。
需要注意的是,在使用一些方法时,java会强制要求用户去抛出相应的异常。
I/O流
一、File类
文件的创建与删除
创建一个文件对象
File file=new File("路径");
下面看一个例子
例:在项目中创建FileText类,在主方法中判断D盘的根目录是否存在word.txt文件,如果改文件存在则将其删除,不存在则创建该文件
import java.io.File;
public class File Test{
public static void main(String[] args){
File file=new File("D:\\word.txt");
if(file.exists()){
file.delete();
System.out.println("文件已删除");
}else {
try{
file.createNewFlie();
System.out.println("文件已创建");
}catch(Exception e){
e.printStackTrace();
}
}
}
}
例:获取文本文件的名称,长度和隐藏属性
import java.io.File;
public class File Test{
public static void main(String[] args){
File file=new File("D:\\word.txt");
if(file.exists()){
String name=file.getName();
long length=file.length();
boolean hidden=file.isHidden();
System.out.println("文件名称是:"+name);
System.out.println("文件长度是:"+length);
System.out.println("是隐藏文件吗:"+hidden);
}else {
System.out.println("文件不存在");
}
}
}
文件输入/输出流
FileInputStream与FileOutputStream类
直接看一个例子:向文本文件中写入内容,再读取出来
import java.io.*;
public class FileSteamDemo {
public static void main(String[] args)
{
File file=new File("D:\\word.txt");
try{
FileOutputStream out=new FileOutputStream(file);
byte buy[]="我有一头小毛驴,我从来也不骑。".getBytes();
out.write(buy);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try{
FileInputStream in =new FileInputStream(file);
byte[] byt=new byte[1024];
int len=in.read(byt);
System.out.println("文件中的信息是:"+new String(byt,0,len));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileReader和FileWriter类
使用FileOutputStream类项文件中写入数据与使用FileIntputStream类从文件中将内容读取出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法,由于汉字在文件中占有两个字节,如果使用字节流,读取不好可能出现乱码现象,此时采用字符流FileReader类或者FileWriter类即可避免这种问题。
FileReader类顺序地读取文件,只要不关闭流,每次调用read()方法就会顺序地读取源文件中的其余内容,直到源文件的末尾或被关闭。读到末尾返回-1
例:使用字符流读写文本文件
import java.io.*;
public class FileSteamDemo{
public static void main(String[] args){
File file=new File("D:\\word.txt");
try{
FileWriter fw=new FileWriter(file);
String word="明月几时有,把酒问青天";
fw.write(word);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try{
FileReader fr =new FileReader(file);
char ch[]=new char[1024];
int len=fr.read(ch);
System.out.println("文件中的信息是:"+new String(ch,0,len));
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}