一、异常类
1.定义
- 异常就是程序运行时可能出现的一些错误。
- 异常处理将会高边程序的控制流程,让程序有机会对错误作出处理。
2.异常类的分类
2.1异常类体系结构
注:
1. Java中异常类Throwable【类】是顶级异常类
2. RuntimeException是Exception的子类。
2.2Error与Exception的区别
- Error是java程序运行中不可预料的异常情况,这种异常发生后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【癌症】
- Exception是java程序运行中可预料的异常情况,可以获取到这种异常,并且对这种异常进行业务外的处理。【感冒】
2.3 运行时异常与非运行时异常的区别
- 非运行时异常—>检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)
- 运行时异常—>非检查性异常 在代码编写时,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。
2.4 Java中常见运行时异常
- NullPointerException 空指针引用异常
- ClassCastException 类型强制转换异常。
- IllegalArgumentException 传递非法参数异常。
- ArithmeticException 算术运算异常(除0)
- ArrayStoreException 向数组中存放与声明类型不兼容对象异常
- IndexOutOfBoundsException 下标越界异常
- NegativeArraySizeException 创建一个大小为负数的数组错误异常
- NumberFormatException 数字格式异常
- SecurityException 安全异常
- UnsupportedOperationException 不支持的操作异常
3. try-catch语句
3.1 原理
- JAVA使用try-catch语句来处理异常,将可能出现的异常放在try部分,一旦try部分抛出异常对象,或者调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分立刻结束执行,转向执行相应的catch部分。所以程序可以将发生异常后的处理放在catch部分。
- 带finally()子语句的try-catch语句,在执行try-catch语句后,执行finally子语句。
- 注意:如果在try-catch语句中执行了return,那么finally仍会被执行;try-catch语句中执行了程序退出代码(System.exit(0)),则不执行finally语句。
3.2 语句
try{
包含可能发生异常的语句。
}
catch(ExceptionSubClass1 e){
...
}
catch(ExceptionSubClass1 e){
...
}
finally()
3.3 实例
package com.company;
public class Main {
public static void main(String args[]) {
int n = 0, m = 0, t = 1000;
try {
m = Integer.parseInt("8888");
n = Integer.parseInt("ab89");//发生异常,转向catch
t = 7777;//t没有机会被赋值
} catch (NumberFormatException e) {
System.out.println("发生异常:" + e.getMessage());
}
System.out.println("n=" + n + ",m=" + m + ",t=" + t);
try {
System.out.println("故意抛出I/O异常");
throw new java.io.IOException("我是故意的");//故意抛出异常
} catch (java.io.IOException e) {
System.out.println("发生异常:" + e.getMessage());
}
}
}
运行结果:
4.throw和throws关键字
- throws —> 声明方法抛出异常给上一级【谁调用谁就是上一级】
格式:访问限制修饰符 返回值类型 方法名称()throws 具体异常类型{ };
当我们无法判断读具体异常类型的时候使用Exception/Throwable代替
public class Test {
public static void main(String[] args) throws Exception {
throw new Exception("抛出一个检查时异常");
}
}
- throw —> 手动引发一个具体异常
自定义异常 —> 编写一个新类,继承Exception/Throwable,在构造方法中访问父类的构造方法。
public class Test{
public static void main(String[] args) {
throw new NullPointException("抛出一个空指针异常");
}
}
5. 断言
作用:
断言用于调试代码,可以使程序停止执行。
断言语句
assert booleanExpression;
//booleanExpression值为true继续执行,值为false停止执行
assert booleanExpression:messageException;
//booleanExpression值为true继续执行,值为false停止执行并输出messageException表达式的值
二、常用类
1.String类
1.1构造语法
//用String类声明对象并创建对象
String s = new String("we are students.");
//用已创建的String对象创建另一个String对象
String tom = new String(s);
//用一个字符数组a创建一个String对象->String(char[])
char a[]={'J','A','V','A'};
String s=new String(a);
//提取字符数组a中的一部分字符创建一个String对象-> String(char a[],startIndex,intcount)
char a{}={'零','一','二','三','四','五','六'};
String s=new String(a,2,4);
//相当于String s=new String("二三四五")
1.2常用方法
-
public int length():获取String对象的长度
-
public boolean equals(String s):比较当前String对象字符序列与参数s指定的String对象字符序列是否相同
-
public boolean startsWith(String s):判断字符序列前缀是否为参数s指定的对象的字符序列
public boolean endsWith(String s):判断字符序列后缀是否为参数s指定的对象的字符序列 -
public int compareTo(String s):按字典序与对象s的字符序列比较大小,相同返回0,大于s的字符序列返回正值,小于返回负值。
-
public boolean contains(String s):判断是否包含s的字符序列
-
public int indexOf(String s):从当前String对象的字符序列的0索引位置开始检索首次出现 str的字符序列的位置并返回该位置,没有检测到则返回-1.
public int IastIndexOf(String s):从当前String对象的字符序列的0索引位置开始检索最后一次出现 str的字符序列的位置并返回该位置,没有检测到则返回-1. -
public String substring(int startpoint):获得一个新的String对象,新对象的字符序列是复制当前String对象字符序列中startpoint位置至最后位置上的字符得到的字符序列。
public String substring(int start,int end):获得一个新的String对象,新对象的字符序列是复制当前String对象字符序列中start位置至end-1位置上的字符得到的字符序列。 -
public String trim():获得一个新的String对象,新对象的字符序列是去掉前后空格后的字符序列。
2.StringTokenizer类
2.1构造方法
- StringTokenizer(String s):为String对象s构造一个分析器,使用默认的分隔标志(空格符,换行符,回车符,tab符,进纸符)
- StringTokenizer(String s,String delim):为String对象s构造一个分析器,参数delim的字符序列的任意排列作为分隔标志
2.2实例
StringTokenizer fenxi = new StringTokenizer("you are welcom");
StringTokenizer fenxi = new StringTokenizer("you#*are#*welcome","#*");
3.Scanner类
Scanner对象可以解析字符序列中的单词
String NBA ="I Love This Game.";
Scanner scanner = new Scanner(NBA);
Scanner对象可以调用方法:
useDelimiter(正则表达式);
例如:
Scanner scanner = new Scanner(cost);
Scanner.useDelimiter("[^0123456789.]+");//设置分隔标记,匹配所有非数字字符序列
4.StringBuffer类
4.1与String类的区别
- String对象的字符序列是不可修改、删除的,String对象的实体是不可能在发生改变的。
- StringBuffer类对象的实体内存空间可以自动的改变大小,便于存放一个可变的字符序列。
例如:
StringBuffer a=new StringBuffer("我喜欢");
s.append("钓鱼");//append追加字符序列
4.2构造方法
- StringBuffer(); 初始容量16字符
- StringBuffer(int size); 初始容量size字符
- StringBuffer(String s); 初始容量s的字符序列长度加16;
注:length()方法获取是体重存放的字符序列长度
capacity()方法获得当前实体的实际容量
4.3常用方法
- append方法:追加,返回当前对象的引用
- public char charAt(int n);得到字符序列位置n上的字符
public void setCharAt(int n,char ch);将字符序列n位置的字符用ch代替 - StringBuffer insert(int index,String str);将str插入index位置,返回当前对象的引用。
- public StringBuffer reverse(); 将字符序列翻转,返回当前对象引用。
- StringBuffer Delete(int startIndex,int endIndex)从字符序列中删除子字符序列,返回当前对象的引用。
- StringBuffer replace(int startIndex,int endIndex,String str)将子字符序列用str替换
5.Date类与Calendar类
5.1Date类
构造方法
//无参数构造方法:本机当前日期时间
Date nowtime=new Date();
//带参数的构造方法:参数取整数表示公元后时间,负数表示公元前时间。
Data data1=new Date(1000);
data2=new Data(-1000);
5.2Calendar类
使用Calendar类的static方法getInstance()可以初始化一个日历对象。
//初始化日历对象
Calendar calendar =Calendar.getInstance();
//调用方法将日历翻到任何一个时间
public final void set(int year,int month,int date,int hour,int minute,int second);
//调用方法获取年份,月份,小时,星期灯信息
calendar.get(Calendar.MONTH);
calendar.get(Calendar.DAY_OF_WEEK);
//调用public long getTImeInMillis()可以返回当前对象中时间的毫秒计时。
6.Math类、BigInteger类和Random类
6.1Math类
Math类中包含许多用来进行科学计算的static方法
常用方法
- public static long abs(double a) 返回 a 的绝对值
- public static double max(double a,double b) 返回 a , b 最大值
- public static double min(double a,double b) 返回 a , b 最小值
- public static double random() 产生一个 0~1 的随机数,不包含 0 和 1
- public static double pow(double a,double b) 返回 a 的 b 次幂
- public static double sqrt(double a) 返回 a 的平方根
- public static double log(double a) 返回 a 的对数
- public static double sin(double a) 返回 a 的正弦值
- public static double asin(double a) 返回 a 的反正弦值
- public static double ceil(double a) 返回大于 a 的最小整数,并转化为 double 类型
- public static double floor(double a) 返回小于 a 的最小整数,并转化为 double 类型
- public static long round(double a) 返回值是 (long)Math.floor(a+0.5) ,即四舍五入
6.2BigInteger类常用方法
用来处理特别大的整数
常用方法:
- public BigInteger add(BigInteger val):返回和a的和
- public BigInteger subtract(BigInteger val):返回和val的差
- public BigInteger multiply(BigInteger val):返回和val的积
- public BigInteger divide(BigInteger val):返回和val的商
- public BigInteger remainder(BigInteger val):返回和val的余数
- public BigInteger compareTo(BigInteger val):返回与val的比较结果,1表示大于val,-1小于val,0等于val
- public BigInteger abs():返回绝对值
- public BigInteger pow(int a):返回当前对象的a次幂
- public BigInteger toString():返回当前对象的十进制字符串表示
- public BigInteger toString(int p):返回当前对象的p进制字符串表示
6.3Random类
更为灵活的获得随机数
构造方法:
public Random();
//使用当前及其实践作为种子创建对象
public Random(long seed);
//使用参数seed指定种子创建对象
Random random=new Random();
rondom.nextInt();//调用不带参数的nextInt方法
random.nextInt(100);//带参数,随机数生成器返回0~99的随机数
7.Class类与Console类
7.1 Class类
Class类的实例可以帮助程序创建其他类的实例,也可以用class对象得到某个类的实例。
步骤:
//1.使用Class的类方法得到一个和某类相关的Class对象
public static Class forName(String classname) throws ClassNotFoundException;
//2.获得Class对象调用
public Object newInstance() throws InstantiationException;
IlleagalAcceddException
//方法就可以得到className对象。
//注意使用Class对象调用newInstance()实例化一个className类的对象是,className类必须有无参数的构造方法。
7.2Console类
在键盘上输入一行文本,但是不让该文本回显示,即不在命令行显示。
//cons调用readPassword()方法读取键盘上输入的一行文本,并将文本以一个char数组返回:
Console cons=System.console();
char[] passwd=cons.readPassword();
8.Pattern类与Match类
用于模式匹配,检索和指定模式匹配的字符序列。
//建立Patter类
String regex="good";//regex正则表达式
pattern=Pattern.compile(regex);
//得到Matcher对象
Matcher matcher=pattern.matern(input);
三、容器
3.1容器定义
在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。
3.2容器常用方法
- boolean add(Object obj):向容器中添加指定的元素
- Iterator iterator():返回能够遍历当前集合中所有元素的迭代器
- Object[] toArray():返回包含此容器中所有元素的数组。
- Object get(int index):获取下标为index的那个元素
- Object remove(int index):删除下标为index的那个元素
- Object set(int index,Object element):将下标为index的那个元素置为element
- Object add(int index,Object element):在下标为index的位置添加一个对象element
- Object put(Object key,Object value):向容器中添加指定的元素
- Object get(Object key):获取关键字为key的那个对象
- int size():返回容器中的元素数
3.3容器分类
总计只有四种容器:List、Set、Map、Queue
3.3.1List接口
List是有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List接口的子类:
- ArrayList (类)
-ArrayLis是基于数组实现的List类,它封装了一个动态的、增长的、允许再分配的Object[ ]数组.它允许对元素进行快速随机访问
当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 - Vector (类)
Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。所以现在已经不太常用了 - Stack (类)
Stack是Vector提供的一个子类,用于模拟**“栈”**这种数据结构(LIFO后进先出) - LinkedList (类)
LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。
另外,它还实现了Deque接口,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
3.3.2 Set接口
满足集合的无序性,确定性,单一性;Set只能有一个null。
Set的子类:
- HashSet (类)
HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。
值得主要的是,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等。 - SortedSet (接口)
此接口主要用于排序操作,实现了此接口的子类都属于排序的子类 - TreeSet(类)
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态 - EnumSet (类)
EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的
3.3.3Queue 接口
此接口用于模拟“队列”数据结构(FIFO)。新插入的元素放在队尾,队头存放着保存时间最长的元素。
Queue的子类、子接口:
-
PriorityQueue—— 优先队列(类)
其实它并没有按照插入的顺序来存放元素,而是按照队列中某个属性的大小来排列的。故而叫优先队列。 -
Deque——双端队列(接口)
ArrayDeque(类)
基于数组的双端队列,类似于ArrayList有一个Object[] 数组。
LinkedList (类)
3.3.4 Map接口
Map用于保存具有“映射关系”的数据。
Map的子类、子接口
- HashMap (类)
和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准一样: 两个key通过equals()方法比较返回true、 同时两个key的hashCode值也必须相等 - HashTable (类)
- SortedMap(接口)
如同Set->SortedSet->TreeSet一样,Map也有Map->SortedMap->TreeMap的继承关系。 - WeakHashMap(类)
看名字就能发现,这是Weak后的HashMap。但是二者大体差别不大。
区别在于,HashMap的key保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。
但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对。 - IdentityHashMap(类)
这个类也和HashMap类似,区别在于,在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等 - EnumMap(类)
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。EnumMap根据key的自然顺序存储。
以上容器部分转载自https://blog.csdn.net/weixin_42574142/article/details/87125363