今日学习String的工具类和异常

1.String常用工具类

按照下标搜索【字符|Unicode】
按照内容搜索【下标|是否存在|判断开头结尾】
字符串间【拼接|比较是否相同|比较字典大小】
转换自身【字节数组|字符数组|去掉首位空白|大写|小写|拆分|转移到常量池|字符串截取】

  str.charAt(10);                //查找下标10的字符
  str.codePointAt(10);           //查找下标10的Unicode
  str.indexOf(“s”);              //查找文字的下标
  str.indexOf(“s”,10);           //查找10下标后的第一个s文字的下标
  str.lastIndexOf(“s”);          //查找倒数第一个s文字的下标
  str.lastIndexOf(“s”,10);       //查找倒数10下标前的第一个s文字的下标
  str.contains(“str”);           //是否包含str文字
  str.isEmpty();                 //是否是一个没有内容的字符串
  str.startswith(“s”);           //是否以s文字开始
  str.endswith(“tr”);            //是都以tr文字结束
  str.concat(“str”);             //拼接一个str字符串在文字后
  str.equals(“wefwe”);           //比较是否与wefwe字符串文字相同
  str.equalsIgnoreCase(“STR”);   //比较是否与STR字符串文字相同,忽略大小写
  str.compareTo(“aaa”);          //比较和aaa字符串谁的字典顺序大
  str.getBytes();                //转换为字节数组
  str.toCharArray();             //转换为字符数组
  str.trim();                    //去掉首位空白
  str.toUpperCase();             //转换为大写
  str.toLowerCase();             //转换为小写
  str.split(“t”);                //根据t字符拆分字符串成字符串数组
  str.intern();                  //将堆中数据转移到常量池
  str.substring(10);             //从第10下标开始截取字符串后半部分
  str.substring(12,20);          //从下标[的数据截取到新字符串中
字符串copy 
  char[]chars;
  str.copyValueOf(chars);        //将字符串中的数据***chars数组中
  str.copyValueof(chars,5,10);   //将字符串中[5,10)数据copy到chars数组中
  • String类型需要注意的地方:
  1. 在Java底层中String是一个被封装的字符数组,即
    private final char[] value;
    在创建一个新的字符串时,实际上就是创建了一个新的字符数组给替换过来了。
这里有一个小题:
String a1 = "abcd";
String a2 = "abcd";
String a3 = "ab"+"cd";
String a4 = "ab";
String a5 = "cd";
System.out.println(a1==a2);             //true
System.out.println(a1=="abcd");         //true
System.out.println(a1==a3);             //true
System.out.println(a3=="abcd");         //true
System.out.println((a4+a5)=="abcd");    //false
System.out.println((a4+a5)==(a4+a5));   //false
/*
原因就是String类型的值是文本字符串,存放在常量池里。
String类型里存放的是文本字符串在常量池中的地址值。
所以a1、a2指向的是同一个在常量池中的文本字符串的地址值。
a3实际上也是“abcd”,因为他是两个文本字符串链接出来的,也在常量池中
所以a1、a2、a3指向的是同一个在常量池中的文本字符串的地址值。
a4+a5实际上是两个字符数组合并成的新的字符数组,它是变量运算,不在常量池中;
在堆中开辟了运算空间,运算完成后放到了栈内存中。
所以a4+a5存的地址值是运算完在栈中的“abcd”的地址和a1、a2、a3存的地址值不一样
为什么(a4+a5)!=(a4+a5),是因为这是进行了两次运算,在栈中有两个运算完的结果;
虽然内容相同,但是地址不同,也就是说(a4+a5)!=(a4+a5)
如果给(a4+a5)使用intern方法将数据存入常量池,那么它和a1、a2、a3的地址值相同
*/
  1. 在使用equals方法比较时要注意:中文在Java底层是两个字节,它比较的是字符串指向的地址后的内容,而不是地址值
  2. String类型在Java底层中有一个哈希码,默认是0;哈希码(hash):是一种数据压缩技术。一个数据智能对应一个hash值,一个hash值对应多个数据,目的是讲无限个数据。打乱顺序。并且尽量均匀分布在有限的空间中,也称特征码。
  3. null和“”(空字符串)的区别:String=null;说的是String类型中没有地址,String=“”;说的是String类型中有地址,但是它指向的地方没有数据。
  4. str.length();说的是调用了String类型的length方法,来计算字符串的长度;它跟数组中的length不一样,数组中的length是数组中的属性,统计数组的长度。
  5. String不适合做大批量字符串拼串操作,尽量在计算结束后将数据转移到常量池,即使用String类型中的intern方法。

2.异常

  • java Throwable类是Java语言中所有错误或异常的超类
    Throwable有两个分支:Error错误,Exception异常
    Exception 是程序业务逻辑上的问题,可以从代码编写角度上避免的。
    Error是允许环境上的问题,程序员无法从java层面上解决,需要运维方面解决
  • Exception异常
    异常分为运行时异常和非运行时异常两类,但不是代码级别的分类,是功能上的分类。
    例如:
    数组下标越界异常就是运行时异常,
    如果访问文件时,文件无法访问,无法读写就是非运行时异常。
  • 异常产生原因解析:
    图片说明
    • 异常的机制:
      异常的机制分为捕获,抛出两种。而抛出还分为声明抛出,和手动抛出。
      抛出就是让程序自己处理异常,这样会终止程序,也就是说程序没有处理异常的能力,抛出后就停止执行,返回到出现异常的地方;捕获是处理异常,出现的异常该怎样处理异常,处理完异常后继续执行下面的程序。
  1. 捕获的格式是
    try{
    可能出现错误的原项目代码
    }catch(想要捕获的异常类型 异常变量名{
    如果捕获到catch中声明的异常,如何处理
    }finally{
    这段可能出现异常的代码,执行完毕后,无论是否成功都要执行的代码
    }

    public void useadd(){
    try{
    add();
    }catch(Exception1,Exception2,Exception3){
    }
    //useadd方法调用了add方法,在使用add方法时要对add声明的可能发生的异常处理
    //继续抛出
    public void useadd2()throws Exception1,Exception2,Exception3{
    add();
    //useadd2方法调用了add方法,但是useadd2自身没有解决可能出现的问题,而是继续抛出,
    让调用useadd2的调用者选择如何处理。
    }
  2. 抛出的格式:

    • 声明抛出:方法可能出现的异常用throws声明出来,在执行add方法时如果出现了异常,就停止add方法的执行,回到add方法的调用处。在add方法的调用处要事先做好异常处理。异常处理仍然可以选择是捕获还是抛出。
      public class Demo{
      public void add()throws Exception1,Exception2,Exception3{
    • 手动抛出
      public class Demo{
      public void add(int a,int b){
      if(b==0)throw new Exception();
      System.out.print1n(a/b);
      public void **method(** a,*** b){
      if(判断a是否不符合业务逻辑)throw new DIY_Exception();
      if(判断b是否不符合业务逻辑)throw new DIY_Exception();
      }

throws 关键字在方法上声明该方法要拋出的异常,然后在方法内部通过 throw 拋出异常对象。

  • throws 关键字和 throw 关键字在使用上的几点区别如下:
  1. throws 用来声明一个方法可能抛出的所有异常信息,throw 则是指拋出的一个具体的异常类型。
  2. 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
  3. throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
  • 自定义异常就是继承了exception的类,主要和throw配合做到业务逻辑的约束
    自定义一个类,继承异常exception。 就有了异常的特性,称为自定义异常
    public class Myexception extends Exception{ }
  • 异常链:如果一个代码可能产生多种异常,那么要从小到大捕获多种异常格式是
try{
}catch(最小异常a){
}catch(较小异常b){
}catch…

}finally{}