Java基础学习之异常处理

一 集合的总结

package com.lanou3g;

import java.util.HashMap;
import java.util.Hashtable;

/*
 * HashMap 与Hashtable 的区别?
 * *HashMap与Hashtable区别?
 * HashMap
 * JDK1.2
 * 线程不安全的
 * HashMap可以保存null值
 * 
 * 
 * Hasntable
 * JDK1.0
 * 线程安全
 * Hashtable不能保存null值
 * 
 * 
 * ArrayList
 * JDK1.2
 * 线程不安全的
 * 查找快,增删慢
 * 
 * linkList
 * 线程不安全
 * 查询慢,增删快
 * 
 * Vector
 * JDK1.0
 * 线程安全
 * 
 * 
 * 
 * HashSet   去重
 * 线程不安全
 * TreeSet   排序
 * 线程不安全
 * linkedHashSet  有序怎么存怎么取.
 * 线程不安全
 * 
 */
public class Demo01 {
	public static void main(String[] args) {
		HashMap<String, String> map = new HashMap<>();
		map.put("代号", null);
		map.put(null, null);
		Hashtable<String, String>  table = new Hashtable<>();
		table.put(null, "大海");
	}

}
 
 

二 异常

1.异常的分类

异常处理的类  

 --  throwable(所有异常的父类) 两个子类

 --  Error  (系统崩溃,数据库崩溃) 

 --  Exception 编译时异常(程序员的错误)

未雨绸缪(为你可能发生的异常,做一个准备)

特点:强制你去处理这个异常,不处理就报错.

 --  RuntimeException(运行时异常)


通常在main函数中产生的异常由main函数自己处理,但是main函数没做处理的话,就会向上级抛出异常由JVM处理.

JVM默认的处理方式:

1.打印错误所在位置

2.打印错误信息

3.停止程序

2.发生异常的处理方法

try  //  catch   // finally 

try :指的是要测试的代码部分.(有可能发生异常的代码)

catch :指的是要捕获的异常

finally :指的是异常处理后要执行的代码.

异常处理步骤:

class TextException{
	public int fun(int a, int b) {
		//发生异常时会创建一个异常对象
		//new ArithmeticException("异常信息/ by zero")
		//这时会把创建的异常对象返回 给它的上级去处理(谁调用这个方法上级就是谁)
		//这个异常对象就返回给main函数
		//main函数接到异常没有处理传给JVM处理.
		//JVM打印错误信息.       
		
		
		return a/b;
	}
public static void main(String[] args) {
		TextException text  =new TextException();
		try {
			//放可能发生异常的代码
			//返回ArithmeticException 对象.
			int num = text.fun(10, 0);
			System.out.println(num+"32541654");
		}catch (ArithmeticException e) {
			//ArithmeticException e = new ArithmeticException();
			// 捕获的异常对象
			//捕获成功 会执行catch中代码
			//程序不会被终止
			System.out.println("/ by zero");
		}catch ( IndexOutOfBoundsException e) {
			System.out.println("越界异常");
		}catch (Exception e) {
			System.out.println("Exception异常");
		}
		
	}

多catch处理异常:

  由上至下进行匹配,匹配上一个就不运行了

  catch捕获时使用的类 要由小到大 书写


需求:

 创建一个人类 有name 和 age

 要求 人类的年龄赋值时 要在 0 到 120岁之前


public static void main(String[] args) throws Exception {
		Person person = new Person();
		person.setName("萧峰");
		//自己处理
		/*try {
			person.setAge(10000);
			//调用该方法可能接受到异常对象,需要你来处理.
			System.out.println(person);
		} catch (Exception e) {
			//打印错误信息
			System.out.println(e.getMessage());
		}*/
		
		
		//把异常抛给上级处理
		//在main方法上标识该方法有异常
		person.setAge(10000);
		System.out.println(person);		
	}

定义一个person类

class Person{
	private String name;
	private int age;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) throws Exception {
		//判断年龄
		if (age>0 && age<120) {
			this.age = age;
		}else {
			//抛出一个异常
			//创建一个异常
//			Exception exception = new Exception("你超出标准人类年龄范围请前往地狱");
			//使用throw关键词抛出异常
			//报错原因: 该方法不支持抛出异常,需要在方法中标识一下本方法可以抛出一个异常对象
			//使用throws 来标识方法是个带异常的方法
//			throw exception;
			//抛出自定义异常
			AgeOutOfBoundsException e = 
					new AgeOutOfBoundsException("你超出标准人类年龄范围请前往地狱");
					
			throw e;
		}
		
	}
	@Override
	public String toString() {
		return "person [name=" + name + ", age=" + age + "]";
	}
	
	
}

自定义异常类:类名要见名知意.

class AgeOutOfBoundsException extends Exception {

	/**
	 * 序列化ID
	 */
	private static final long serialVersionUID = 1L;
//	//无参构造方法
//	public AgeOutOfBoundsException() {
//		// TODO Auto-generated constructor stub
//	}
//	//有参构造方法,传入的是异常信息
//	public AgeOutOfBoundsException(String message) {
//		super(message);
//	}
}
public static void main(String[] args) throws FileNotFoundException  {
		//读取文件 传入要读取文件的路径
		//系统不知道 你有没有这个文件
		//未雨绸缪 强制出一下 没有这个文件 怎么办
		//相当于 要为可能发生的异常 提前做准备
		
		//自己处理 编译时异常
		/*try {
			FileInputStream fis = new FileInputStream("wl.tet");
		} catch (FileNotFoundException e) {
			System.out.println("你没有这个文件");
		}*/
		
		//抛出去处理
		FileInputStream fis = new FileInputStream("wl.tet");
	}

继承中的异常

public class Demo03 {

}
class Father{
	public void fun() {
		
	}
}
class son extends Father{
	//重写父类方法
	@Override
	public void fun() {
		// 调用带异常的方法
		//不能把异常抛出去处理 
		//这时只能使用try catch 处理
		try {
			method();
		} catch (Exception e) {
			// TODO: handle exception
		}
		super.fun();
	}
	public void method() throws Exception {
		throw new Exception();
	}
	
}
另外在父类中的方法没有抛出异常
那么子类在重写父类的这个方法的时候
也不能抛出异常.
如果父类抛出异常,子类也可以抛出异常并且可以try catch 处理.

为了更好的理解异常的运行进制看下面一个例子

 完成两个数的加法 和 除法的功能(设计完成 要求分装方法和异常处理)

 分析: 把两个数分装成一个对象

 MyNum类  : 把两个数分装成一个对象  类中属性就是这两个数

 用户输入数字类: 接收用户输入的数字(异常处理)

 循环 递归

 

 操作类 

 1.获取封装好的MyNum对象 :让用户输入俩数

 2.获取用户输入要做的运算(输入 1 和 2  1是加法  2是 除法   异常处理)

 除法方法 (有可能出现异常 出现异常 重新输入 数据)    加法方法

 根据用户要做的运算  和 那两个数 计算出结果

 

 测试类: 

 测试..

/*
 * 封装数字的类
 */
public class MyName {
	private int num1;
	private int num2;
	public MyName() {
		super();
		// TODO Auto-generated constructor stub
	}
	public MyName(int num1, int num2) {
		super();
		this.num1 = num1;
		this.num2 = num2;
	}
	public int getNum1() {
		return num1;
	}
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	public int getNum2() {
		return num2;
	}
	public void setNum2(int num2) {
		this.num2 = num2;
	}
	@Override
	public String toString() {
		return "MyName [num1=" + num1 + ", num2=" + num2 + "]";
	}
}
/*
 * 提供用户输入数字的类
 */

import java.util.Scanner;

public class IntTool {
		//构造方法私有化
		private  IntTool() {}
		
		/*public static int getNum() {
			Scanner scanner = new Scanner(System.in);
			String string  = scanner.nextLine();
			//转数字
			
			try {
				int num = Integer.parseInt(string);
				return num;
			} catch (Exception e) {
				System.out.println("请你输入数字");
				//再调用一次本方法
				return getNum();
			}
			
		}*/
		
		public static int getNum1(){
			System.out.println("请你输入数字");
			while (true) {
				Scanner scanner = new Scanner(System.in);
				String string  = scanner.nextLine();
				try {
					int num = Integer.parseInt(string);
					return num;
				} catch (Exception e) {
					System.out.println("请你输入数字");

				}
			}
			
			
		}
}
/*
 * 操作运算的类
 */
public class Operact {
	//获取Myname对象
	public MyName getNumt() {
		int num1=IntTool.getNum1();
		int num2 =IntTool.getNum1();
		//构建MyName 对象
		MyName myName = new MyName(num1, num2);
		return myName;
		
	}
	//获取哦用户输入的 运算复合
	public String getMethod() {
		System.out.println("请输入数字 1 为加法 2 是除法");
		
		int num = IntTool.getNum1();
		if (num==1) {
			return "+";
		}else if (num==2) {
			return "/";
		}else {
			System.out.println("请从新输入1或2");
			//再次调用本方法 实现重新输入
			return getMethod();
		}
	}
	//加法
	
	public int sum(MyName myName) {
		return myName.getNum1() + myName.getNum2();
	}

	//除法(可能出现除以 0 的异常 处理一下)
	public int  div(MyName myName) throws DivNotZeroExcception {
		
		try {
			return myName.getNum1()/myName.getNum2();
		} catch (ArithmeticException e) {
			//捕获这个异常
			// 直接抛出去 让调用者去处理
			throw new DivNotZeroExcception("0不可以做除数");
		}
	}
		//根据运算符 和数字 计算结果
	public int getRelsult(String operact,MyName myName) {
	if (operact.equals("+")) {
		return sum(myName);
	   }	
	//除法
	   try {
		return div(myName);
	} catch (DivNotZeroExcception e) {
		// JVM 默认打印的信息 位置和异常类
//		e.printStackTrace();
		System.out.println(e.getMessage());
		//重新调用getnum
	MyName m = getNumt();
	  //重新计算结果
	return getRelsult(operact, m);
		}
	}
}

class DivNotZeroExcception extends Exception{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public DivNotZeroExcception() {
		super();
	}

	public DivNotZeroExcception(String message) {
		super(message);

	}
	
}
public class Test {
	public static void main(String[] args) {
		//测试
		Operact operact = new Operact();
		//获取两个数的对象
		MyName numt = operact.getNumt();
		//获取操作符
		String method = operact.getMethod();
		//计算
		int result = operact.getRelsult(method, numt);
		System.out.println(result);
	}

}

运算加法时

请你输入数字
1
请你输入数字
2
请输入数字 1 为加法 2 是除法
请你输入数字
1
3

运算除法时

请你输入数字
1
请你输入数字
2
请输入数字 1 为加法 2 是除法
请你输入数字
2
0

输入非数字的异常反馈

请你输入数字
1
请你输入数字
2
请输入数字 1 为加法 2 是除法
请你输入数字
呜呜
请你输入数字

除零的异常反馈

请你输入数字
5
请你输入数字
0
请输入数字 1 为加法 2 是除法
请你输入数字
2
0不可以做除数
请你输入数字








猜你喜欢

转载自blog.csdn.net/vlin_fan/article/details/80456364