一 集合的总结
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不可以做除数 请你输入数字