什么是异常?
异常是对问题的描述,将问题的对象进行封装;
异常体系的特点:异常体系中的所有类以及建立的对象;
都具有可抛性,也就是说可以被throw和throws关键字所操作,只有异常体系具有该特点;
throws定义在函数上,用于抛出异常类;throw定义在函数内,用于抛出异常对象,前者可以抛出多个,用逗号隔开。
代码加注释讲解:
package demo1;
/*
* 有一个圆形和长方形*
* */
class NoValueException extends Exception{
NoValueException(String msg){
super(msg);
}
}
class NoValueExceptionT extends RuntimeException{
NoValueExceptionT(String msg){
super(msg);
}
}
interface Shape{
void getArea();
}
class Rec implements Shape
{
private int len,wid;
Rec(int len, int wid)//throws NoValueException
{
if (len<=0||wid<=0)
throw new NoValueExceptionT("矩形参数出现非法值");
this.len=len;
this.wid=wid;
}
public void getArea(){
System.out.println(len*wid);
}
}
class Circle implements Shape{
private int r;
Circle(int r) {
if (r<=0)
throw new RuntimeException("圆的参数出现非法值");//自定义异常,为了增强可读性“NoValueExceptionT”
this.r = r;
}
public static final double PI=3.14;
public void getArea(){
System.out.println(Math.pow(r, 2)*PI);
}
}
public class test1 {
public static void main(String[] args) {
/*try {
Rec rec= new Rec(-4, 5);
rec.getArea();
} catch (NoValueException e) {
System.out.println(e.toString());
System.out.println(e.getMessage());
e.printStackTrace();
}*/
/* Rec rec= new Rec(4, 5);
rec.getArea();*/
Circle c=new Circle(-8);
c.getArea();
System.out.println("over");
}
/*
* 异常是对问题的描述,将问题的对象进行封装
* 异常体系的特点:异常体系中的所有类以及建立的对象
* 都具有可抛性,也就是说可以被throw和throws关键字所操作
* 只有异常体系具有该特点
* throws定义在函数上,用于抛出异常类;throw定义在函数内,用于抛出异常对象,前者可以抛出多个,用逗号隔开*/
/*
* 当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上申明,否则编译失败
* pc: runtimeexcpetion除外。也就是,函数内如果抛出runtimeexcpetion异常
* 函数上可以不用申明。
*
* 如果函数申明了异常,调用者需要进行处理,处理方法可以用throws或try
*
* 异常有两种:
* 1.编译时异常
* 没有抛出也没有try,则编译失败;
* 该异常被标识,代表可以被处理。
* 2.运行时异常(编译时不检测)
* 在编译时不需要处理,编译器不检查
* 该异常发生,建议不处理,让程序停止,需要修正代码。
* pc:多个catch,父类的catch放在最下面
* */
// 异常处理的三种模式
/*1.
try {
需要检测的代码块
} catch (Exception e) {
需要处理的代码块
pc:当 System.exit(0);此时finally 代码块不执行,只有这种情况(面试题);
finally
}finally {
必需执行的代码块
常用于关闭资源
}
2.
try {
} catch () {
}
3.
try {
} finally {
}*/
/*自定义异常:
自定义类继承Exception或runtimeException
1.为了让自定义类具备可抛性;
2.让该类具备操作异常的共性方法;
当要自定异常信息时,可以使用父类已经定义好的功能。
将异常信息传递给父类的构造函数。
优点:
1.按照java的面向对象的思想,将程序中出现的特有问题进行封装;
2.将正常流程代码和问题处理代码相分离,方便阅读。
*/
//如:
class NoValueException extends Exception{
NoValueException(String msg){
super(msg);
}
}
class NoValueExceptionT extends RuntimeException{
NoValueExceptionT(String msg){
super(msg);
}
}
}