飞道的博客

Java学习笔记15(详细代码讲解异常)

395人阅读  评论(0)

异常

RuntimeException

错误的类型转换
数组下标越界
空指针访问

IOExeption

从一个不存在的文件中读取数据**FileNotFoundException**
越过文件结尾继续读取EOFException
连接一个不存在的URL

异常概述

例如除数为0,数组下标越界,要读写的文件不存在等等。
除数为0
Exception in thread “main” java.lang.ArithmeticException: / by zero
at day10.Test.main(Test.java:13)

public class Test {
	
	public static void main(String[] args) {
		
	int a = 0;
	int b = 4/a;
	System.out.println(b);
	}

}

数组下标越界
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at day10.Test.main(Test.java:9)

public class Test {
	
	public static void main(String[] args) {
		String[] str1 = new String[] {"10","20","30"};
		for(int i =0 ; i < 4; i ++) {
			//,i <3,才正确,这种是数组越界异常
			System.out.println(str1[i]);
		}
	}
	

}

空指针异常:
Exception in thread “main” java.lang.NullPointerException
at day10.Test.main(Test.java:9)

public class Test {
	
	public static void main(String[] args) {
		
//		A a = new A();
		A a = null;
		System.out.println(a.i);
	}
	

}


class A{
	int i;
}

异常处理机制

try
捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码放在try语句块中。
如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类父类Exception类作为catch的参数。
可以用ArithmeticException类作为参数,也可以用RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数**。但不能是与ArithmeticException类无关的异常,如NullPointerException,那么,catch中的语句将不会执行。**

使用 try…catch…finally 处理异常

异常处理是通过try-catch-finally语句实现的。

try
{
… //可能产生异常的代码
}
catch( ExceptionName1 e )
{
… //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e )
{
… //当产生ExceptionName2型异常时的处置措施
}
[ finally{
… //无条件执行的语句
} ]

不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行。

声明抛出异常

package day10;

public class Test1 {
	public static void main(String[] args) {
		B b  = new B();
		try{
			b.test();
		
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}

}

class B {
	int i;
	public void test() throws Exception{
		B b = null;
		System.out.println(b.i);
	}
}

java.lang.NullPointerException
at day10.B.test(Test1.java:21)
at day10.Test1.main(Test1.java:7)

告诉你是第七行,main方法里面有异常,test里面第21行有异常。

重写方法不能抛出比被重写方法范围更大的异常类型
子类不能抛出比父类更大的异常

人工抛出异常

package day10;

public class Test1 {
	public static void main(String[] args) {
		B b  = new B();
		try{b.test1(-100);
		
		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

class B {	
	int age;
	public void test1(int age) throws Exception{
		if(age > 0 && age< 150) {
			this.age = age;
			System.out.println("年龄是"+ this.age);
		}else {
			throw new Exception("年龄不在1·150");
		}
	}
		
}

java.lang.Exception: 年龄不在1·150
at day10.B.test1(Test1.java:29)
at day10.Test1.main(Test1.java:6)

创建用户自定义异常类

了解性内容,因为只有特殊情况才需要自己定义异常类!!!

package day10;

public class Test1 {
	public static void main(String[] args) {
		B b  = new B();
		//打印异常
		try{
//			b.test1(-100);
			b.test2(-10);
		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

class B {	
	int age;
	public void test1(int age) throws Exception{
		if(age > 0 && age< 150) {
			this.age = age;
			System.out.println("年龄是"+ this.age);
		}else {
			throw new Exception("年龄不在1·150");
		}
	}
	
	//自定义异常类MyException
	public void test2(int age) throws MyException{
		if(age > 0 && age< 150) {
			this.age = age;
			System.out.println("年龄是"+ this.age);
		}else {
			throw new MyException("年龄不在1·150");
		}
	}
		
}

//自定义异常类MyException
class MyException extends Exception{
	//构造方法
	public MyException(String msg) {
		//子类调用父类的构造方法
		super(msg);
	}
}

day10.MyException: 年龄不在1·150
at day10.B.test2(Test1.java:35)
at day10.Test1.main(Test1.java:9)


转载:https://blog.csdn.net/weixin_41710541/article/details/105277114
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场