21年10月22号___处理异常
java的又一个好处---抛出异常
当我们遇到这样一种情况:想让客户输入一串数字,然后客户非常不客气地输入一个字符串“我是你爸爸“,或者我们想让客户输入一串字符串,但客户什么也没输入就提交了,导致输入不成功。我们意识到必须做点什么来避免这场事故,增强程序的健壮性(鲁棒性,Robust----Strong and healthy)。
我们可以这样:
import java.util.Scanner;
public class Main{
public static void f(String s) {
}
public static void main(String[] args){
String str;
Scanner sc=new Scanner(System.in);
while (true){
System.out.print("请输入字符串:");
str=sc.nextLine();
if(str.length()>0)
break;
else{
System.out.println("必须输入字符串!!");
continue;
}
}
f(str);//处理字符串
}
}
java的开发者比你我精明,他早就预料到这种情况。
为了保证他的宝贝语言自己的输入输出等函数不被咱们玩儿坏,java规定,必须在使用java内置的某些函数的时候,使用异常抛出机制。
比如这里,在食用IO流的时候,我们需要向系统抛出异常,或者自己内部用try catch语句捕获异常并抛出错误。
这时候上面咱们的程序就变成了这样,功能还没变:
import java.io.*;
public class Main{
public static void main(String[] args) {
long start=System.currentTimeMillis();
// BufferedInputStream bis=new BufferedInputStream(new FileInputStream("F:\\videos\\1.mp4"));
// BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("F:\\videos\\1cp.mp4"));//59毫秒
FileInputStream fis = null;
try {
fis = new FileInputStream("F:\\videos\\1.mp4");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream("F:\\videos\\1cpcp.mp4");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//349
byte[] bytes=new byte[1024];
int len;
try {
while((len=fis.read(bytes))!=-1) fos.write(bytes,0,len);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end=System.currentTimeMillis();
System.out.println(end-start);
}
}
受此启发,我们可以利用这个java官方的try catch处理语句,自己搞事情。
try {
fis = new FileInputStream("F:\\videos\\1.mp4");
} catch (FileNotFoundException e) {
System.out.println("wrong!");
//e.printStackTrace();
}
或者:
<%
String teachername = request.getParameter("teachername");
String classname = request.getParameter("classname");
String place = request.getParameter("place");
//String[] ss = request.getParameterValuse("uhobbies");
try{
if(!teachername.trim().equals("王建民")&&!teachername.trim().equals("刘立嘉")&&!teachername.trim().equals("刘丹")&&!teachername.trim().equals("王辉")&&!teachername.trim().equals("杨子光"))
{
throw new Exception("不能输入规定之外的老师名称");
}
else if(!place.trim().startsWith("基教")&&!place.trim().startsWith("一教")&&!place.trim().startsWith("二教")&&!place.trim().startsWith("三教"))
{
throw new Exception("不能输入规定之外的地点名称!");
}
else
{
HaveClass haveclass = new HaveClass();
haveclass.setTeachername(teachername);
haveclass.setClassname(classname);
haveclass.setPlace(place);
ClassDaoImpl classDao = new ClassDaoImpl();
classDao.add(haveclass);
}
}catch(Exception e){
%>
<h2 style="color:red ; font-size:50px">发生错误 : <%=e.getMessage() %></h2>
<%
}
%>
总结
我们可以用三种方式处理异常:
- 调用系统函数需要抛出的异常直接抛给系统,让系统给咱处理
- 调用系统函数需要抛出的异常咱给系统处理,捕获后用e.printStackTrace();让系统抛出
- 咱自己调用什么东西,自己看不惯客户的输入,用throw语句捕获它,自己写异常,反馈给客户(这就是利用try catch搞事情了)
关于java的系统异常
所有的异常都是从Throwable继承而来的,Throwable是所有异常的共同祖先。
Throwable有两个子类,根据可不可以被程序本身处理,分为Error和Exception。Error是虚拟机自身发生的错误,如超出栈空间,人为不能够处理。
Exception是程序本身可以处理的异常,分为可检查异常IOException和程序运行时发生,不可检查异常RuntimeException。
IOException就是程序执行前,必须要进行处理(抛出或者try/catch)的异常。
RuntimeException就是运行时检查出来的异常,如NPE空指针异常,除数为0的算数异常ArithmeticException等等。
有图有真相: