/*
因为 在项目中会出现特有的问题
而这些问题并未被java所描述并封装
所以对这些特有的问题可以按照java的对问题封装的思想
将特有的问题,进行自定义的异常封装
自定义异常
需求:
在本程序中对于除数是负数-1,也是视为是错误的,是无法进行运算的
那么就需要对这个问题进行自定义的描述。
当在函数内部出现throw抛出异常对象,那么就必须给要对应的处理动作
要么在内部try catch 处理
要么在函数上声明让调用这处理
一般情况在 函数内出现异常,函数上需要声明.
发现打印的结果中只有异常名称,却没有异常的信息
因为自定义的异常并未定义信息
如何定义异常信息呢。
因为父类中已经把异常信息操作都完成了,
所以子类只要在构造时,将一类信息传递给父类通过super语句
那么就可以直接功过getMessage方法获取自定义的异常。
自定义异常: 必须是自定义类继承Exception
继承Exception原因:
异常体系有一个特点,因为异常类和异常对象都需要被抛出,
他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点
只有这个体系中的类和对象才可以被throws 和throw 操作。
throws和throw区别
throws使用在函数上
throw 使用在函数内
throws 后面跟的是异常类,可以跟多个,用逗号隔开 就是:()这个位置{}
throw 后面跟的是异常对象。
【【异常中的特殊子类异常】】
Exception 中有一个特殊的子类异常RuntimeException 运行时异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明该异常,调用者可以不用进行处理,编译一样通过
之所以在函数上声明,是因为不需要调用者处理
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,
希望停止程序后,由程序员对代码进行修正。
【m】
自定义的异常时:如果该异常的发生,无法在急促进行运算
就让自定义类异常继承RuntimeException
对于异常,分两种
1、编译时,被检测的异常 (方法后需要抛出异常。)
2、编译时,不被检测的异常(运行时的异常就是RuntimeException异常)
(方法中抛出了非Run异常或其子类,上面没有标识,就视为有安全隐患的。)
【【【【结论:如果自定义异常,要么继承Exception要么继承RuntimeException】】】】
*/
class FuException extends Exception{
private int value;
//这个也可以,里面有默认的。
FuException(){
super();
}
FuException(String msg,int value){
super(msg);
this.value=value;
}
public int getValue(){
return value;
}
/* 【m】
}
class FuException extends RuntimeException{
private int value;
//这个也可以,里面有默认的。
FuException(){
super();
}
FuException(String msg,int value){
super(msg);
this.value=value;
}
public int getValue(){
return value;
}
class Demo_3{
int div(int a,int b) //这里不在需要声明
{
if(b <0){
throw new FuException("出现负数",b);//手动通过throw 关键字抛出一个自定义的异常
}
if(b =0){
throw new FuException("出现0",b);//手动通过throw 关键字抛出一个自定义的异常
}
return a/b;
}
}
*/
}
class Demo_3{
int div(int a,int b) throws FuException
{
if(b <0){
//System.out.println("出现异常:");
throw new FuException("出现负数",b);//手动通过throw 关键字抛出一个自定义的异常
}
return a/b;
}
}
public class D_Exception {
public static void main(String[] args){
Demo_3 d=new Demo_3();
try{
int x=d.div(4,2);
System.out.println("x="+x);
}
catch(FuException e){
//System.out.println(e.toString());
//System.out.println("出现负数");
System.out.println("负数:"+e.getValue());
}
//catch(Exception e){
//}
System.out.println("over");
}
}
/*
class Person_1{
public void checkName(String name){
//if(name.equals("lisi")){//一旦[a]处传入NULL,那么就回报NullPointerException异常
程序就停掉了。如何修正:
if("lisi".equalse(name)){//if(name!==null&&name.equals("lisi")){
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
main(){
Person_1 p=new Person_1();
p.checkName(null);//[a]
}
*/
------------------------------------------------------------------------------------------------------------------------------
【【异常应用】】
package _9Day;
/*
* 异常应用
*
* 毕老师用电脑上课。
* 老师、电脑、俩类,上课是行为.
*
* 上课中会出现各种问题,产生异常。
* 比如电脑、蓝屏、冒烟儿 :接下来进行描述,封装成对象 (自定义异常
* 蓝屏后只许重启即可
* 而 当冒烟发生后,会出现进度无法继续。
* 就出现了讲师的问题,课时计划无法完成。 (又多了个类
*
* 【通过state来手动设置异常】
*/
//蓝屏异常
class LPException extends Exception{
//蓝屏是可以处理的,大多时候重启即可,那么这里就需要电脑的重启功能了
private Comeputer comp;
LPException(String message){
super(message);
}
public void goReset(){
comp.reset();
}
}
//冒烟异常
class MYException extends Exception{ //RuntimeException{//冒烟了无法处理了
MYException(String message){
super(message);
}
}
//人为异常
class NoPlanException extends Exception{
NoPlanException(String message){
super(message);
}
}
class Comeputer {
//
private int state =3;//2表示蓝屏 3冒烟
public void run()throws LPException,MYException{//抛出可能有的异常
if(state==2){
throw new LPException("电脑蓝屏了。");//抛出异常
}
if(state==3){
throw new MYException("电脑冒烟儿了");//抛出异常
}
System.out.println("comepter run");
}
public void reset(){
state=1;
System.out.println("comepter reset");
}
}
//
class Teacher{
private String name;
private Comeputer cmpt;
Teacher(String name){//初始化老师名字、电脑
this.name=name;
cmpt=new Comeputer();
}
public void prelect()throws NoPlanException{//MYException{//讲课方法
try{
cmpt.run();
}
catch(LPException e){
cmpt.reset();
}
catch(MYException e){//接收到冒烟异常然后抛出冒烟后无法继续讲课的问题,这个问题就好处理
test();
throw new NoPlanException("课时无法继续"+e.getMessage());
//这里的逻辑是,冒烟是不可处理异常,发生该异常后,处理就是换电脑,换老师等延续课时的方案。
//test(); throw 后面是不能更语句的。他和return一样是结束语句。
}
//System.out.println("开始讲课");
}
public void test(){
System.out.println("大家做练习吧");
}
}
public class D_Exp_Test1 {
public static void main(String[] args) {
Teacher t=new Teacher("毕老师");
try{
t.prelect();
}
catch(NoPlanException e){
System.out.println(e.toString());
System.out.println("换老师,换电脑,放假");
}
}
}
---------------
黑马官网: http://edu.csdn.net/heima