Java异常类和常用类以及容器

1. 异常类

1.1 概念

异常就是程序运行时 (编译时缺少括号或分号等不算) 可能出现的一些错误,比如试图打开一个根本不存在的文件、除0溢出、数组下标越界等,异常处理将会改变程序的控制流程,让程序有机会对错误处理。 Java 使用 throw 关键字抛出一个 Exception 子类的实例表示异常发生,该异常实例封装了异常事件的信息并将被提交给 Java 运行时系统。

例如

int number = Integer.parseInt("ab89");
//试图将字符串 "ab89" 转换成数字

方法 parseInt() 在执行过程中使用 throw 关键字抛出一个 NumberFormatException 对象,即程序运行出现 NumberFormatException 异常。
Java允许定义方法时声明该方法调用过程中可能出现的异常,即允许方法调用过程中抛出异常对象,终止当前方法的继续执行。
异常对象可以调用如下方法得到或输出有关异常的信息

public String getMessage();
public void printStackTrace();
public String toString();

1.2 try-catch 语句

1.2.1 格式

Java 使用 try-catch 语句来处理异常,将可能出现的异常操作放在 try-catch 语句的 try 部分,一旦 try 部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么 try 部分将立刻结束执行,转向执行相应的 catch 部分。所以程序可以将发生异常后的处理放在 catch 部分。 try-catch 语句可以由几个 catch 组成,分别处理发生的相应异常。还可以加上 finally 语句。

try{
	包含可能发生异常的语句
}catch(ExceptionSubClass1 e){  //catch后面的"()"中专门定义具体异常类型
	异常处理方式
}catch(ExceptionSubClass2 e){
	异常处理方式
}finally{
	最终处理方式
	//有无异常都要执行
}

各个 catch 参数中的异常类都是 Exception 的某个子类,表明 try 部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的 catch 即可。

1.2.2 实例

public class Example_1{
	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.IOEception e) {
			System.out.println("发生异常:"+e.getMessage)
		}
	}
}

运行结果:
输出

public class Example_2 {
	public static void main(String[] args) {
		//1.当我们无法判断 try{} 何种具体异常的时候,
		//我们可以在 catch 块的参数中通过定义 Exception / Throwable 类的对象来代替具体异常类型。
		/*
		try {
			int res = 10/0;
			System.out.println("res=="+res);
		}catch(Exception e) {
			System.out.println("处理异常!");
		}
		*/
		//2.一个 try{} 后面可以跟随多个 catch 块,多个 catch 块需要按照具体异常的级别由低到高排列
		try {
			int  numbers[]=new int[2];
			numbers[0] = 10;
			numbers[1] = 0;
			int num1 = numbers[0];
			int num2 = numbers[1];
			int num3 = num1 / num2;
			numbers[2] = num3;
			System.out.println("程序执行完毕!!");
		} catch (IndexOutOfBoundsException e3) {
			System.out.println("处理数组下标越界异常!");
		} catch (ArithmeticException e2) {
			System.out.println("处理除数为0的异常!");
		} catch (Exception e1) {
			System.out.println("exception异常!");
		} catch (Throwable e) {
			System.out.println("Throwable异常!");
		} finally {
			System.out.println("有无异常都要执行");
		}
	}
}

运行结果:
在这里插入图片描述

1.2.3 throw 和 throws 区别

  • throw : 语句抛出一个异常-----throw(异常对象)
throw new java.io.IOException("我是故意的");
  • throws : 方法可能抛出异常的声明,抛给上一级(谁调用谁就是上一级)-----访问限制修饰符 返回值类型 方法名称()throws 具体异常类型{ }
public  int  testMethod() throws Exception{
		int  a = 10/0;
		return a;
	}

1.3 异常分类

在这里插入图片描述

  • Throwable : Java 抛出异常的类;
    • ErrorJava 程序运行中不可预料的异常情况,这种异常发生后,会直接导致 JVM 不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如 OutOfMemoryErrorNoClassDefFoundError 等。(比如开车上山结果山塌了)
    • ExceptionJava 程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。(比如刹车坏了可以修)
      • RuntimeException: Java 运行时经常出现的异常,可以不处理(比如开车路上有石子,不用下车把石子扫了)

1.4 常见异常类

  • 算数异常类:ArithmeticExecption
  • 类型强制转换类型:ClassCastException
  • 数组负下标异常:NegativeArrayException
  • 数组下标越界异常:ArrayIndexOutOfBoundsException
  • 文件未找到异常:FileNotFoundException
  • 字符串转换为数字异常:NumberFormatException

2. 常用类

2.1 String类

由于在程序设计中经常涉及处理和字符序列有关的算法,为此 Java 专门提供了用来处理字符序列的 String 类。 String 类在 java.lang 包中,由于 java.lang 包中的类被默认引入,因此程序可以直接使用 String 类。需要注意的是 JavaString 类定义为 final 类,因此用户不能扩展 String 类,即 String不可以有子类

常用方法:

public int length()//获取 String 对象的字符序列的长度
public boolean equals(String s)//比较当前对象是否与参数 s 指定的对象的字符序列相同
public boolean startsWith(String s)//判断当前对象的字符序列前缀是否是参数 s 指定对象的字符序列
public boolean endsWith(String s)//判断当前对象的字符序列后缀是否是参数 s 指定对象的字符序列
public int compareTo(String s)//按字典序与参数 s 指定对象的字符序列比较大小,相同返回 0 ,大于 s 返回正值,小于 s 返回负值
public boolean contains(String s)//判断当前对象字符序列是否包含参数 s 的字符序列
public int indexOf(String s)//当前对象字符序列 0 索引位置开始检索首次出现 s 字符序列的位置,并返回该位置,没有检索到返回 -1 
public int lastIndexOf(String s)//当前对象字符序列 0 索引位置开始检索最后一次出现 s 字符序列的位置,并返回该位置,没有检索到返回 -1 
public String substring(int startpoint)//获得一个新的 String 对象,新对象是复制当前对象 startpoint 位置至最后位置的字符
/*若调用 substring(int start,int end) ,则复制 start 到 end-1 */
public String trim()//得到当前对象去掉前后空格后的新字符序列

2.2 StringTokenizer 类

有时需要分析 String 对象的字符序列并将字符序列分解成可被独立使用的单词,这些单词叫作语言符号。例如,对于 “You are welcome” ,如果把空格作为分隔标记,那么 “You are welcome” 就有三个单词(语言符号);而对于 “You,are,welcome” ,如果把逗号作为分隔标记,那么 “You,are,welcome” 有三个单词。
当分析一个 String 对象的字符序列并将字符序列分解成可被独立使用的单词时,可以用 java s.util 包中的 StringTokenizer 类,该类有两个常用的构造方法。

StringTokenizer(String s)//为 String 对象 s 构造一个分析器。使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记
StringTokenizer(String s,String delim)//为 String 对象 s 构造一个分析器。参数 delim 的字符序列中的字符的任意排列作为分隔标记

例如

StringTokenizer fenxi = new StringTokenizer("you are welcome");
StringTokenizer fenxi = new StringTokenizer("you#*are#*welcome#*","#*");

2.3 Scanner 类

Scanner 对象可以调用方法

useDelimiter(正则表达式)

将正则表达式作为分隔符标记。

Scanner scanner = new Scanner(cost);
Scanner.useDelimiter("[^0123456789.]+");//设置分隔标记,匹配所有非数字字符序列

2.4 StringBuffer 类

String 对象的字符序列的字符不能被修改、删除、即 String 对象的实体是不可以再发生变化的。与 String 类不同, StringBuffer 类的对象的实体的内存空间可以自动改变大小,便于存放一个可变的字符序列。
例如

StringBuffer s = new StringBuffer("我喜欢");
s.append("睡觉");//追加字符序列

2.5 Date 类与 Calendar 类

  • Date 类:可获取本机的当前日期和时间
Date nowTime = new Date();//无参构造方法,有参构造方法返回公元前(参数取正)或后(参数取负)的时间
System.out.println(nowTime);
  • Calendar 类:使用该类的 static 方法 getInstance()可初始化一个日历对象

2.6 Math 类、BigInteger 类 和Random 类

2.6.1 Math类

常用方法:

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) ,即四舍五入(小于 0.5 舍)

2.6.2 BigInteger 类

程序如果需要处理特别大的整数,就可以用 java.math 包中的 BigInteger 类中的对象,可以使用构造方法 public BigInteger(String val)构造一个十进制的 BigInteger 对象
常用方法:

public BigInteger add(BigInteger val)//返回当前对象与 val 的和
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 int compareTo(BigInteger val)//返回当前对象与 val 的比较结果,返回值是 1 、-1 、0  ,分别表示当前对象大于、小于或等于 val
public BigInteger abs(BigInteger val)//返回当前整数对象的绝对值
public BigInteger pow(int a)//返回当前对象的 a 次幂
public String toString()//返回当前对象十进制的字符串表示
public String toString(int p)//返回当前对象 p 进制的字符串表示

2.6.3 Random 类

Rondom random = new Random();
random.nextInt();//返回一个随机整数
random.nextInt(100);//返回 [0,99) 之间的整数
random.nextBoolean();//返回一个随机 boolean 值

2.7 Class 类与 Console 类

  • Classjava.lang 包中的类,该类的实例可以帮助程序创建其他类的实例
  • Console 类:如果希望在键盘输入一行文本,但不想让该文本回显,即不在命令行显示,那么就需要使用 java.io 包中的 Console 类的对象来完成。
Console cons = System.console();//首先使用 System 类调用 console() 方法返回 Console 类的一个对象,例如 cons
char [] passwd = cons.readPasswd();//然后, cons 调用 readPasswd() 方法读取用户在键盘输入的一行文本,并将文本以一个 char 数组返回

2.8 Pattern 类与 Matcher 类

模式匹配就是检索指定模式匹配的字符序列。 Java 提供了专门用来进行模式匹配的 Pattern 类和 Matcher 类,这些类在 java.util.regex 包中。

String input = "hello,good morning,this is a good idea";//我们想知道 input 的字符序列从哪个位置开始至哪个位置结束曾出现了字符序列 good
String regex = "good";
Patttern pattern = Pattern.compile(regex);//模式对象
Matcher matcher = pattern.macher(input);//匹配对象

3. 容器

3.1 概念及分类

Java API 所提供的一系列的实例,用于在程序中存放对象。
在这里插入图片描述

  • Collection 接口定义了存取一组对象的方法,其子接口 SetList 分别定义了存储方式。
    • Set 中的数据对象没有顺序不可以重复
      • HashSet 使用 HASH 算法来存储集合中的元素,因此具有良好的存取查找性能。当向 HashSet 集合中存入一个元素时, HashSet 会调用该对象的 hashCode()方法来得到该对象的 hashCode 值,然后根据该 hashCode 值决定该对象在 HashSet 中的存储位置。 HashSet 集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等。(无序,需要排序功能时,使用 TreeSet
    • List 中的数据对象有顺序可以重复
      • LinkedList 是用链表结构存储数据的,很适合数据的动态插入删除,随机访问和遍历速度比较慢。
      • ArrayList基于数组实现的 List 类,它封装了一个动态的、增长的、允许再分配的 Object[ ] 数组。它允许对元素进行快速随机访问 ,当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找遍历,不适合插入和删除。
  • Map 接口定义了存储“键( key )—值( value )映射对”的方法,value 可重复,但 key 不可重复
    • HashMapHashSet 集合不能保证元素的顺序(有序为 TreeMap )一样, HashMap 也不能保证 key-value 对的顺序。并且类似于 HashSet 判断两个 key 是否相等的标准一样: 两个 key 通过equals()方法比较返回 true 、 同时两个 keyhashCode 值也必须相等

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
// set 接口没有此方法,因为 set 是无序,不存在某元素具体位置的概念
Object add(int index,Object element)//在下标为 index 的位置添加一个对象 element
Object put(Object key,Object value)//向容器中添加指定的元素
Object get(Object key)//获取关键字为 key 的那个对象
int size()//返回容器中的元素数

4. 参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值