java中的异常的详细解答
Java中的异常
1.异常的分类
在Java中,所有的异常(Exception)和所有的错误(Error)都有⼀个⽗类:Throwable类。位于java.lang包中
1.1.Error类
java.lang.Error类是⼀个程序⽆法处理的错误,严重性⽐较⼤,⼀般发⽣此错误,就表⽰了程序运⾏出现了⼤⿇烦⼤错误,例如:JVM系统内部错误或资源耗尽等严重情况,JVM需要负担的责任,这⼀类异常事件⽆法恢复或不可能捕获,将导致应⽤程序中断,交由系统处理。
1.2.Exception类
java.lang.Exception类是由于程序编程错误或偶然的外在因素导致的⼀般性问题。这类异常得到恰当的处理时,程序有机会恢复⾄正常运⾏状况。分为运⾏时异常和受检异常(编译异常)。
2.常见的运⾏时异常和编译异常(受检异常)
2.1.什么是运⾏时异常(RunTimeException)
就是运⾏时才给你报错的异常。编译器不要求强制处置的异常。⼀般是指编程时的逻辑错误,所以能避免就尽量避免,否则起来就要把F6按坏。
2.2.常见的运⾏时异常
ArithmeticException 算术异常:最常见的就是做除法运算时,除数为0的情况了。
NullPointerException 空指针异常:这也是很常见的⼀种异常了。在我之前的⽂章中就有⼀篇主要针对NullPointerException异常的处理逻辑。
ArrayIndexOutOfBoundsException 数组下标越界异常。这个异常在数组中就⽐较常见。
IndexOutOfBoundsException 这也是⼀种下标越界的异常,是ArrayIndexOutOfBoundsException这个异常的⽗类,在集合中就经常见了,⽐如在ArrayList中获取超过它的个数的下标时就会报这个错误
NumberFormatException 数字格式异常。有时尝试将String类型转换为数字类型是,该字符⼜不能满⾜数字格式时后就会报错。这个在算术运算时有时也会遇到,例如传⼊的是⼀串abc的String类型进⾏Integer.parseInt()。
inputMismatchException 输⼊类型不匹配异常。 这个在前期学习中⼀直在控制台输⼊打印最经常出现的错误了。就是你设置接收的类型跟你输⼊的类型不⼀致就会
NegativeArraySizeException 数组⼤⼩负数异常。这个错误应该说⼀般不会出现吧,谁会吃饱了撑着去创建应该数组然后指定⼤写为负数的。
。。。此处省略⼀堆其他类型的RunTimeException类型异常
2.4.什么是受检异常
受检异常也叫编译异常。就是在你写出来的时候,编译器就会给你划红线。编译器要求必须处置的异 常。指的是程序在运⾏时由于外界因素造成的⼀般性异常。
2.5.常见的受检异常
ClassNotFoundException 没有到指定名称的类
FileNotFoundException ⽂件可能不到
IOException 操作⽂件可能发⽣的异常
SQLException 操作数据库可能发⽣的异常
。。。此处省略⼀堆受检异常。
其实发现这些异常的产⽣原因都很相似,就是可能要你去操作⼀个外界的的东西的时候,就是不确定因素约束嘛。
既然了解了,那就来看⼀下代码**:常见的运⾏时异常**
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//RuntimException:运⾏时异常(⾮检查异常):编译时没有提⽰出错,运⾏时报错
public class TestRunTimeException {
public static void main(String[] args){
//  test1();
//  test2();
//  test3();
//  test4();
//  test5();
//  test6();
//  test7();
test8();
}
//空指针异常 NullPointerException
public static void test1(){
String name=null;
/
/Exception in thread "main" java.lang.NullPointerException
System.out.Class());
}
//算术异常 ArithmeticException
public static void test2(){
int i=0;
int n=10/i;
//Exception in thread "main" java.lang.ArithmeticException: / by zero
System.out.println(n);
}
//类型转换异常
public static void test3(){
Object obj="110";
Integer i=(Integer) obj;
//Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
System.out.println(i);
}
//数组下标越界 IndexOutOfBoundsException
public static void test4(){
List list=new ArrayList();
//Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
System.out.(0));
}
nextint()方法//数组下标越界 ArrayIndexOutOfBoundsException
public static void test5(){
int[] nums=new int[0];
//  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
//  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
System.out.println(nums[1]);
}
//
//输⼊类型不匹配异常
public static void test6(){
Scanner sc=new Scanner(System.in);
System.out.print("输⼊⼀个整数:");
int Int();
//Exception in thread "main" java.util.InputMismatchException
System.out.println(n);
}
//数字格式异常
public static void test7(){
String str="abc";
int s=Integer.parseInt(str);
int n=10;
/
/Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"  System.out.println(s/n);
}
//数值⼤⼩负数异常
public static void test8(){
int[] nums=new int[-10];
}
}
受检异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//CheckedException:受检异常,检测异常,还没运⾏就提⽰错误,编译器强制你去处理的异常public class TestCheckedException {
public static void main(String[] args){
test1();
}
//受检异常,强制你必须去处理
public static void test1(){
FileOutputStream out=new FileOutputStream("g:\\");
}
}
错误Error
/
/1、错误(Error):JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的责任//这⼀类异常事件⽆法恢复或不可能捕获,将导致应⽤程序中断。
//Exception in thread "main" java.lang.StackOverflowError
public class TestError {
Person p=new Person();
public static void main(String[] args) {
TestError err=new TestError();
System.out.println("error演⽰");
}
}
class Person{
TestError test=new TestError();
}
//Exception in thread "main" java.lang.StackOverflowError
//栈满了。递归的时候如果没有设定好出⼝也会报错
3.异常的处理机制
{}catch{}
就是将在try⾥⾯可能出现的错误把它在catch⾥⾯咔嚓掉,程序继续运⾏。
注意:catch后⾯跟着的括号,放的就是你try⾥⾯可能发⽣错误的类型,如NullPointerException。如果你明确知道会报什么类型的错误,那就直接指明该类型。如果你不明确会报什么类型的错误,那么你可以声明为Exception类型,这是所有异常的⽗类,根据以前学过的多态可以明⽩,如果声明为这个类型,那么它可以捕获任何类型的异常。
try{
//可能会发⽣异常的代码
}
catch(Exception e){
//咔嚓掉
//e.printStackTrace() 打印错误信息
}
public class TestTryCatch {
public static void main(String[] args){
System.out.println("异常发⽣前,正常运⾏");
//将有可能发⽣异常的代码⽤try包围起来
try{
System.out.println("算术异常测试");
int i=0;
int j=100/i;//除数不能为0,会有错误
System.out.println("发⽣了错误了");
}
//如果try⾥⾯真的发⽣了异常,那就让catch处理
//最好将知道要发⽣的异常类型传进去,不然可以传所有异常的⽗类Exception
catch(ArithmeticException e){
//e.printStackTrace();//打印异常信息
System.out.println("发现异常,把你捕获");
}
//经过异常处理之后,后⾯的程序将继续运⾏
System.out.println("异常已经被捕获了,我可以继续正常运⾏");
}
}
如果不进⾏异常捕获,那么运⾏到异常处,程序就会直接停⽌,相当于return了。但是如果你想要运⾏异常之后的代码,那你就⽤try…catch捕获。后⾯的代码继续执⾏
3.2.多重 try{} catch{} catch{}
如果你想要根据不同类型的异常抛出不同的声明,那么你就可以使⽤多重try…catch来捕获。
import java.util.Random;
//多重catch进⾏不同类型错误的捕获
//注意:在最后要再添加⼀个Exception异常,把想不到的异常捕获.⽽且这个Exception异常
// 处理不能反正最前⾯,因为他是所有异常⽗类,会直接捕获所有异常类型
public class TestTryCatch2 {
public static void main(String[] args) {
String[] arrs= {"3","0","A","3"};
Random r=new Random();
System.out.println("准备进⾏运算");
try {
int x=Integer.parseInt(Int(5)]);
int y=Integer.parseInt(Int(5)]);
int result=x/y;
System.out.println("计算结果:"+result);
}
catch(ArithmeticException e) {
System.out.println("算术异常,捕捉");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界,没有输⼊参数,捕捉");
}
catch(NumberFormatException e) {
System.out.println("数字类型异常,不是数字,捕捉");
}
catch(Exception e) {
System.out.println("不知道还会发⽣什么异常,全部捕捉吧");
}
System.out.println("计算结果出来了,有异常都已经被捕捉了");
}
}
**注意:**在多重catch的最后,要catch(Exception e)来捕获你可能漏掉的异常类型。但是不能把这个放在最前⾯,不然你什么类型的异常都直接给它抛出了。
3.3.在JDK1.7之后,多重try…catch的不同写法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。