对于异常处理——try-catch和throws的使用及注意事项,throw和throws的区别

异常

1.继承关系

Throwable:
Error:不能处理的 XXXError
Exception:能处理的 xxxException
运行时异常: RuntimeException
NullPointerException,ArrayIndexOfBoundsException
StringIndexOfBoundsException,ArithmeticException等
编译时产生的异常:
IOException,FileNotFoundException,
InterruptedException,SQLException 等

2.运行时异常不强制处理,如果代码写的严谨,可以避免运行时异常的产生
编译时产生的异常必须处理

3.异常处理的两种方式:
throws 抛出异常(声明异常)
try-catch块捕获异常
异常代码块:在日志文件中保存堆栈信息
外行,翻译异常信息
检查代码:直接打印堆栈信息

4.异常块的正确使用语法
try-catch
try-catch-finally
try-catch-catch…finally
try-finally:语法是正确的,但不能捕获异常

5.try-catch可以嵌套使用try-catch块

package cn.tedu.demo;

import java.io.FileNotFoundException;
import java.io.FileReader;

public class Demo3 {
	//运行异常
	//运行时异常,如果代码写的严谨,可以避免运行时异常
	public static void test(){
		String[] names=null;
		// java.lang.NullPointerException
		//System.out.println(names[0].substring(0));
		int[] num={2};
		//java.lang.ArrayIndexOutOfBoundsException
		System.out.println(num[1]);
	}
	//编译时异常
	//throws抛出异常,(声明异常)并不解决
	public static void test2() throws FileNotFoundException{
		FileReader fr =new FileReader("a.txt");
		
	}
	//处理异常的第二种方式,try-catch方式,上面是抛出异常处理
	//try-catch是对代码做了处理,之后将不会再报错的
	//抛出异常则是把错误抛出去了,之后还会产生错误
	public static void test3(){
		try {
			FileReader fr =new FileReader("a.txt");
			Thread.sleep(1000);
		} 
		//可以有多个catch块,但是不能有多个try块,因为catch不能表示前面的错误都
		//被捕获,它只捕获最近的try块,前面的try块不包含不被捕获
		catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();//打印堆栈信息
		}catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			//不论之前的异常有没有,都会执行的finally块
			//是处理一些try块里打开的文件没关闭,连接的网络没断开
			//,对这些浪费的内存就不能及时释放回收。
		}
	}
	
	public static void test5(){
		/*异常块的正确使用语法:
		try-catch
		try-catch-finally
		try-catch-catch..finally
		try-finally(是语法正确的,但是不能捕获异常)
	 */
		try{
			int i=9/0;
		}finally{
			System.out.println("end");
		}
	}
	public static int test6(){
		int i=0;
		//try-catch可以进行嵌套,但是不能进行
		try {
//			try {
//				
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
			return i++;
		} catch (Exception e) {
			return 2;
		}finally{
			i++;
			System.out.println(i);
			System.out.println("end");//结果:2 end 0
			//return i;
			//先执行try里面的内容,当finally里面没有return二try块里面有return时需要先执行
			//如果finally里面有return则会先执行finally里面的
		}
	}
	
	public static String test7(String name){
		try {
			name.length();
		}finally{
			return name+"hello";
		}
	}
	public static void main(String[] args) {
		//System.out.println(test6());
		System.out.println(test7(null));
	}

}

6.执行过程:
如果try中有异常,从异常语句开始不再执行后边的语句
跳到catch执行
不管有无异常,finally块都会执行

      public static int test6() {  
		
		try{
			return 1 ;  
		}catch(Exception e){
			return 2;
		}finally{
			  		
			System.out.println("end");
			
		}		
	}
        //end 1  
public static int test6() {  
		int i = 0;
		try{
			return i++ ;  
		}catch(Exception e){
			return 2;
		}finally{
			i++;
			System.out.println(i);
			System.out.println("end");
			
		}		
	}
        //2  end  0
public static int test6() {  
		int i = 0;
		try{
			return i++ ;  
		}catch(Exception e){
			return 2;
		}finally{
			i++;
			
			System.out.println("end");
			return i;
			
		}		
	}
        //end  2 
        //在 finally块中,尽量不要写return,有时候会屏蔽异常代码
	public static String test7(String name){
		try{
			name.length();
		}finally{
			return name+"hello";
		}
	}

自定义异常类:继承现有的异常

AgeException.java
package cn.tedu.demo;

public class AgeException extends Exception {
	public AgeException(){
		//调用父类带参的构造方法,初始化错误信息
		super("请输入正确的范围数字(1-150)");
		}
	public class Exception{
	    private String message;
	    public Exception(String message){
		this.message=message;
	}
	    public void printStackTrace(){
	    	System.out.println(message);
	    	}
	    public String getMessage(){
	    	return message;
	    	}
	}
}
接口:DomeMessage.java
package cn.tedu.demo;

public interface DemoMessage {
	
	String  ageMessage="请输入正确的范围数字(1-150)";

}

Student.java
package cn.tedu.demo;

public class Student{
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) throws AgeException{
		if(age<1||age>150)
		throw new AgeException();
		this.age = age;
	}
	
	public static void main(String[] args) {
		Student stu =new Student();
		try {
			stu.setAge(100);
			System.out.println(stu.getAge());
		} catch (AgeException e) {
			System.out.println(e.getMessage());
		}
	}
}


方法的重写:
子类方法重写父类方法的异常规则:
异常<=父类的(指编译时异常,与运行时异常无关)
<=:个数、继承关系两个方面进行的判定

throw和throws的区别

throw是抛出异常,异常类对象,在方法内;只能有一个异常类的对象;

throws:是声明异常,异常类类型;方法声明;多个异常类型,用,隔开;

你可能感兴趣的:(代码练习,基础知识)