异常类——Java程序设计基础

一、什么是异常:

异常就是在运行时产生的问题。通常用Exception描述。 在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位置)。

二、 异常的结构            

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出),Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。

 三、异常与错误的区别:

异常是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。

错误是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。

四、异常产生的过程:

1.运行或编译时产生异常

2.创建异常类的对象

3.声明异常类

4.将异常类对象传给调用者(main()方法)处理

5.调用者无法处理,再将异常类对象传给jvm虚拟机

6.jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行

异常举例:
public class Example6_5 {
   public static void main(String args[ ]) {

      int n=0,m=0,t=6666;
      m=Integer.parseInt("8888");
      n=Integer.parseInt("ab85"); //发生异常
      t=9999;  //t没有机会赋值
      System.out.println("n="+n+",m="+m+",t="+t);
    }
}

五、异常处理 try...catch...finally

捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
 语句格式:
         try {

                 //需要被检测的语句。

          }

        catch(异常类1 变量) { //参数。

                 //异常的处理语句。

        }
        catch(异常类2 变量) { //参数。

                 //异常的处理语句。

        }

       finally {

                 //一定会被执行的语句。

        }

try:该代码块中编写可能产生异常的代码。

catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。


捕获异常的组合方式:

1. try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

2. try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

3. 一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。 注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

4. try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

异常处理举例:
        public class Example6_5 {
           public static void main(String args[ ]) {
              int n=0,m=0,t=6666;
              try{  

                    m=Integer.parseInt("8888");
                    n=Integer.parseInt("ab85"); //发生异常,转向catch
                    t=9999;  //t没有机会赋值

              }
             catch(NumberFormatException e) {

                System.out.println("发生异常:"+e.getMessage());
                n=123;

             }
              System.out.println("n="+n+",m="+m+",t="+t);
           }
        }

六、自定义异常、抛出异常throw:

有些情况本来是可以正常运行,但是出于程序的需要,我们需要产生异常,例如输入数字的时候,本来输入201是正常的,但是在输入年龄的时候,超过150就产生异常。 这种情况下我们需要自定义异常。

举例(结合类的使用):
定义一个People类 
        public class People {
             private int age=1;

             public void setAge(int age) throws IntegerException {

                if(age>=160||age<=0) {

                    throw new IntegerException(age); //方法抛出异常,导致方法结束
                }
                else {

                    this.age=age;
                }
             }  

             public int getAge() {

                System.out.println("年龄"+age+"合理");
                return age;
             }
        }



自定义异常类:
        public class IntegerException extends Exception {
           String message;

           public IntegerException(int m) {

               message="年龄"+m+"不合理";
           }

           public String toString() {

               return message;
           }
        } 



在主方法中使用年龄输入:
       public class Example6_6 {
           public static void main(String args[]) {

              People wang=new People(),
              zhang=new People();

              try{  
                    wang.setAge(180);
                    System.out.println(wang.getAge());

              }
              catch(IntegerException e) {

                    System.out.println(e.toString());
              }

              try { 
                    
                    zhang.setAge(37);
                    System.out.println(zhang.getAge());
              }
              catch(IntegerException e) {

                    System.out.println(e.toString());
                }
            }
        }

在java中,提供了一个throw关键字,用来抛出一个指定的异常。

使用方法:
1.创建一个异常对象。封装一些提示信息

2.将这个异常告知调用者 使用格式: throw new 异常类名(参数);

 七、声明异常throws

声明异常格式: 修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{ }

见上面的第2步。 注意抛出异常不一定需要People类,也可以直接在Main主法中抛出异常。想想怎么做

八、自定义类异常

格式:
        Class 异常名 extends Exception{     //或继承RuntimeException
          
            public 异常名(){
            }


            public 异常名(String s){ 
                super(s); 
            }
       }

         例子见上面的第2步

九、异常类中常用方法

在Throwable类中为我们提供了很多操作异常对象的方法,常用的如下:

 1.getMessage方法:返回该异常的详细信息字符串,即异常提示信息

2. toString方法:返回该异常的名称与详细信息字符串

3. printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

回去看最初的例子用e.getMessage()输出异常信息。  

十、自定义异常类实例:

测量身体肥瘦指数公式:

BMI值(BMI=体重/(身高*身高)

BMI在18-25之间为标准。

体重单位为公斤,身高单位为米 。

为了防止用户输入错误,请编写一个自定义异常类,里面定义一个两个异常,一个是身高值XX不正常,一个是体重值不正确。

(1)请用户输入身高和体重,进行下面的判断: 当用户输入的身高超过2.5或小于0.5时,调用异常显示"身高输入错误, xxx不是合理的身高 当用户输入的体重超过300或小于20时,调用异常显示"体重输入错误, xxx不是合理的体重   如果正确,就输出他的身体BMI并输出标准还是肥胖还是偏瘦。

(2)请用类改写上面的代码: 定义一个Person类,里面有身高和体重成员变量,有一个BMI()计算他的BMI值,并有一个show()方法输出他的BMI和身高和体重情况。

主类:

import java.util.Scanner;
public class Mainclass {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Person p =  new Person();
		System.out.println("请输入身高和体重:");
		
		try {
			double height = new Scanner(System.in).nextDouble();
			p.setHeight(height);
			
			try {
				double weight = new Scanner(System.in).nextDouble();
				p.setWeight(weight);
			}
			catch(WeightException e) {
				System.out.println(e.toString());
			}
			p.show();
		}
		catch(HeightException e) {
			System.out.println(e.toString());
		}
	}
	
}


对象类:

package zidingyiyichanglei;
public class Person {
	protected double height;
	protected double weight;

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) throws HeightException{
		if(height>2.5 || height<0.5)
			throw new HeightException(height);
		else
			this.height = height;
	}

	public double getWeight() {
		
			return weight;
	}

	public void setWeight(double weight) throws WeightException {
		if(weight>300 || weight <20)
			throw new WeightException(weight);
		else
			this.weight = weight;
	}

	public void show() {
		double BMI = weight/(height*height);
		System.out.println("BMI = " + BMI);
		if(BMI<=18)
			System.out.println("你的体重为偏瘦!");
		else if(BMI>=25)
			System.out.println("你的体重为偏胖!");
		else
			System.out.println("你的体重为标准体重!");
	}
}


异常类:

public class HeightException extends Exception{
	public String message;
	
	public HeightException(double height) {
		message = "身高输入错误,"+height+"不是合理的身高";
	}
	public String toString() {
		return message;
	}
}



public class WeightException extends Exception{
	public String message;
	
	public WeightException(double weight) {
		message = "身高输入错误,"+weight+"不是合理的身高";
	}
	public String toString() {
		return message;
	}
}



猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/121259452