Throwable
---------+--------
| |
Error Exception
| |
...... ... RuntimeException
1.Error是系统错误,程序员无法处理这些异常
2.Exception是程序员可以捕获并处理的异常
3.RuntimeException的子类异常是你可以处理也可以不处理的异常
4.凡是继承自Exception但又不是RuntimeException子类的异常我们都必须的捕捉并进行处理
*/
class A
{
int divide(int a, int b)
{
int m;
m = a/b;
System.out.printf("1111\n");
return m;
}
}
public class TestExcep
{
public static void main(String[] args)
{
A aa = new A();
try
{
aa.divide(6,0);//写可能异常的语句
}
catch(ArithmeticException e)//e用来接收18行抛出的异常
{
e.printStackTrace();//可以简单理解为输出该异常的具体信息
System.out.printf("除零错误,你的程序出错了,除数不能为零\n");
}
//aa.divide(6,0); //error
System.out.printf("世界和平\n");
}
}
------------------------------------------------------------------------------------------------
import java.util.Scanner;
import java.util.InputMismatchException;
public class TestExcep2
{
public static void main(String[] args)
{
int i;
Scanner sc = new Scanner(System.in);//System.in表示键盘
try
{
i = sc.nextInt();
System.out.printf("i = %d",i);
}
catch (InputMismatchException e)
{
System.out.printf("输入数据不合法,程序被终止\n");
}
}
}
-------------------------------------------------------------------------------------------
class A
{
int divide(int a, int b)
{
return a/b;
}
public void f()
{
g();
}
public void g()
{
divide(6,0);
}
}
public class TestExcep3
{
public static void main(String[] args)
{
try
{
new A().f();
}
catch(Exception e)
{
e.printStackTrace();//打印堆栈路径,也就是把出错信息的详细路径显示出来,调示错误用
}
}
}
------------------------------------------------------------------------------------------
import java.io.*;
class A
{
public void f() throws IOException//表示本方法不处理,让这被调用者来处理,因为不处理,在main中如果用aa.f()就会报错误
{
throw new IOException();//该异常是Exception的子类,必须进行处理,否则会报错
//throw 抛出异常
}
public void g()
{
throw new ArithmeticException();//该异常是runtimeException的子类,可处理也可不处理
}
}
public class TestExcep4
{
public static void main(String[] args)
{
A aa = new A();
}
}
------------------------------------------------------------------------------------
/*Finally的作用
1.无论try所指向的程序块中是否抛出异常,也无论catch语句的异常类型是否与所抛弃的类型一致,finally中所代表的代码一定会得到执行
2.finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态作统一的管理
3.通常在finally语句中可以进行资源的清除工作,如关闭打开的文件,删除临时文件等
*/
class A
{
int divide(int a, int b)
{
int m = 0;
m = a/b;
return m;
}
}
public class TestExcep5
{
public static void main(String[] args)
{
try
{
new A().divide(6,0);
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.printf("6666\n");
e.printStackTrace();
}
finally
{
System.out.printf("哈哈\n");
}
}
}
-------------------------------------------------------------------------------------
/* throw
void f() throws A
{
.....
.....
}
1.throw A表示调用f方法时f方法可能会抛出A类异常,建议你调用f方法时最好对f方法可能抛出的A类异常进行捕捉
2.throws A 不表示f方法一定会抛出A类异常
throws A,f方法也可以不抛出A类异常
3 3.throws A 不表示调用f方法时,必须的对A异常进行捕捉
--1.假设A是RuntimeException子类异常
--2.由于RuntimeException的子类异常可以处理也可以不处理,所以编译器允许你调用f方法时,对f方法抛出的RuntimeException子类异常不进行处理
4.强烈建议你
--1.对throws出的所有异常进行处理
--2.如果一个方法内部已经对A异常进行了处理,则就不要再throws A
*/
import java.io.*;
class DivisorIsZeroException extends Exception//异常类才可以抛出
{
public DivisorIsZeroException(String name)
{
super(name);//调用Exception里面=的构造函数
}
}
class A
{
public int divide(int a,int b) throws DivisorIsZeroException
{
int m;
if(0 == b)
throw new DivisorIsZeroException("除数不能为零");//抛出异常对象
else
m = a/b;
return m;
}
}
public class TestExcep6
{
public static void main(String[] args)
{
A aa = new A();
try
{
aa.divide(6,0);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}