异常

异常含义

异常是正常情况以外的事件,具有不确定性。遇到异常后程序不能正常向下执行。 例如:用户输入错误、除数为0,需要的文件不存在或打不开、数组下标越界、传入参数为空或不符合指定范围。

异常分类

下图罗列了Java中异常类定义的层次关系
异常对象
异常类和其他类的祖先一样都继承了Object类,第二个层次是Throwable类,第三个层次是Exception和Error,它们是平行类。Exception是所有异常类的祖先,Error是所有错误类的祖先。
异常和错误的区别
Error不是程序需要捕获和进行处理的,例如OutOfMemorryError(当Java虚拟机在为对象分配内存时,剩余的空间不够,同时也没有可以释放的内容时,将会发生这样的错误)不由程序进行捕获或处理,当Error发生时,程序将会停止。

异常处理

异常处理

1.声明抛出处理

1.隐式声明抛出

异常类型是RuntimeException或是其子类,程序方法可以对异常不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码给出提示。
main()方法没有进行任何声明与处理,而直接交给调用main()方法的java虚拟机处理

package hai;
import java.util.*;
public class yinshi {
	public static void main(String[]args) {
		Stack s=new Stack();
		Object ob=s.pop();
	}
}

在这里插入图片描述
EmptyStackException是RuntimeException的子类

public class yinshi {
	private static int []x;
	public static void main(String[]args) {
		System.out.print(x[0]);
	}
}

在这里插入图片描述
NullPointerException是RuntimeException的子类

2.显式声明抛出

package hai;
import java.io.*;
public class xianshi {
	public static void main(String[]args) throws IOException {
		BufferedReader k=new BufferedReader(new InputStreamReader(System.in));
		String c;
		int i=0;
		String[]e=new String[3];
		while(i<3) {
			c=k.readLine();
			e[i]=c;
			i++;
		}
	}
}

2.异常捕获处理

将显示声明抛出改写成try-catch的形式就是捕获处理。
异常处理是由try -catch组成的一个异常处理块结构,最为完整的方式是try-catch-finally语句

try{
  statements
}
catch (ExceptionType1 ExceptionObject){
  Exception Handling 
}
catch(ExceptionType2 ExceptionObject) { 
  Exception Handling
}……
finally{
  Finally  Handling 
}

示例:

package hai;
import java.util.*;
public class capture {
	private static int []x;
	public static void main(String[]args){
		try {
			System.out.print(x[0]);
		}
		catch(NullPointerException ExceptionObject) {
			System.out.println("数组尚未分配空间");
			
		}
		catch(EmptyStackException ExceptionObject) {
			System.out.println("空栈异常");
		}
		finally {
			System.out.println("finish");
		}
	}
}
//数组尚未分配空间
//finish

try语句块含有可能出现的异常程序代码,可能会抛出一个或多个异常,因此,try后面可跟一个或多个catch。需要指出的是:当try语句块没有异常发生时,紧跟其后的catch代码块并不被执行。
catch用来捕获异常参数ExceptionObject是ExceptionType类的对象,ExceptionType是Exception类或其子类,它指出catch语句中所要处理的异常类型。catch在捕获异常的过程中要和try语句抛出的异常类型进行比较。若相同,则在catch中进行处理;若不同,寻找其他的catch块再进行比较。
在多catch的情况下,异常类由上到下排布并遵循这样的规则:由子类到父类或为平行关系。
Finally是这个语句块的统一出口,一般用来进行一些善后操作,如释放资源、关闭文件等。

异常嵌套

package hai;
import java.io.*;
public class capture{
	 public static void main(String[] args){
	    int a,b,c,d,e;
	    a=67; b=0;d=0;c=5; 
	    try{
	       try{
	          c=a/b;
	       }
	       catch(ArithmeticException ae){
	          b = 10;
	       }
	       System.out.println(a+"/"+b+"="+ a/b);
	       e=c/d;
	    }
	    catch(ArithmeticException ae){
	    	System.out.println(c);
	    	System.out.println("除数d为0");
	    }
	    catch(Exception f){
	      f.printStackTrace();
	    }
	  }
} 
//67/10=6
//5
//除数d为0

如果捕获了异常后还想执行后面的语句就可以用嵌套捕获;异常嵌套中最内层的try产生的异常对象,如果不能被对应的catch异常类声明引用,则转交给外层的catch处理

RuntimeException类的子类

1.空指针异常

package hai;
public class yinshi {
	private static int []x;
	public static void main(String[]args) {
		System.out.print(x[0]);
	}
}

在这里插入图片描述

package hai;
public class paochu {
	public static void main(String[] args) {
		 int []x;
		System.out.println(x[0]);
		try {
			System.out.println(x[0]);
		}
		catch(NullPointerException e) {
			System.out.println("空指针异常");
		}
	}
}

2.空栈异常

package hai;
import java.util.*;
public class yinshi {
	public static void main(String[]args) {
		Stack s=new Stack();
		Object ob=s.pop();
	}
}

在这里插入图片描述

package hai;
import java.util.*;
public class capture{
	 public static void main(String[] args){
	    try {
	    	Stack s=new Stack();
			Object ob=s.pop();
	    }
	    catch(EmptyStackException ae){
	          System.out.print("空栈");
	    }
	} 
}

3.算数异常

package hai;
public class second {
	public static void main(String[] args) {
		int a,b,c;
		a=5;b=0;
		c=a/b;
		System.out.print(c);
	}
}

在这里插入图片描述

package hai;
public class capture{
	 public static void main(String[] args){
	    int a,b,c,d,e;
	    a=67; b=0;d=0;c=5; 
	    try {
	          c=a/b;
	    }
	    catch(ArithmeticException ae){
	          System.out.print("除数为零");
	    }
	} 
}

4.数组下标越界

package hai;
public class second {
	public static void main(String[] args) {
		Integer []x=new Integer[5];
		System.out.print(x[6]);
	}
}

在这里插入图片描述

package hai;
public class capture{
	 public static void main(String[] args){
		 Integer []x=new Integer[5];
	    try {
	    	System.out.print(x[6]);
	    }
	    catch(ArrayIndexOutOfBoundsException ae){
	          System.out.print("数组下标越界");
	    }
	} 
}

5.数组长度异常

package hai;
public class yinshi {
	public static void main(String[]args) {
		Integer []x=new Integer[-1];
	}
}

在这里插入图片描述

package hai;
public class capture{
	 public static void main(String[] args){
	    try {
	    	Integer []x=new Integer[-1];
	    }
	    catch(NegativeArraySizeException ae){
	          System.out.print("数组长度异常");
	    }
	} 
}

等等还有很多……

自定义异常

package hai;
public class myexception extends Exception{
	   myexception(String msg){
	       super(msg);   //调用Exception的构造方法
	   }
	   static void throwOne() throws myexception{
	       //如果a为1就认为在特定应用下存在异常,改变执行路径,抛出异常
	       throw new myexception("我是珊珊的异常,嘿嘿");
	   }
	   public static void main(String args[]){
	    try{
	       throwOne();
	    }
	    catch(myexception e){
	      e.printStackTrace();
	    }
	  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值