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



%>

总结

我们可以用三种方式处理异常:

  1. 调用系统函数需要抛出的异常直接抛给系统,让系统给咱处理
  2. 调用系统函数需要抛出的异常咱给系统处理,捕获后用e.printStackTrace();让系统抛出
  3. 咱自己调用什么东西,自己看不惯客户的输入,用throw语句捕获它,自己写异常,反馈给客户(这就是利用try catch搞事情了)

关于java的系统异常

所有的异常都是从Throwable继承而来的,Throwable是所有异常的共同祖先。
Throwable有两个子类,根据可不可以被程序本身处理,分为Error和Exception。Error是虚拟机自身发生的错误,如超出栈空间,人为不能够处理。
Exception是程序本身可以处理的异常,分为可检查异常IOException和程序运行时发生,不可检查异常RuntimeException。
IOException就是程序执行前,必须要进行处理(抛出或者try/catch)的异常。
RuntimeException就是运行时检查出来的异常,如NPE空指针异常,除数为0的算数异常ArithmeticException等等。

有图有真相:

posted @ 2021-10-22 21:06  zhuangzhongxu  阅读(35)  评论(0编辑  收藏  举报