Java 基础(第三季)

1. Java 异常

1.1 异常介绍

异常:有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称之为异常

异常处理:是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。

异常处理的作用:释放占用的内存空间,减少损失

Throwable 包括两个方面:(Error 和 Exception)

  • Error(系统错误,无法处理)包括:虚拟机错误,线程死锁

  • Exception:编码、环境、用户操作输入出现问题

Exception 包括:

  • 非检查异常:

    • 空指针异常
    • 数组下标异常
    • 类型转换异常
    • 算数异常 等等
  • 检查异常:

    • 文件异常
    • Sql异常 等等,必须要手动添加捕获以及处理语句

1.2 处理异常

一般使用 Try-catch 以及 Try-catch-finally 来处理异常

    Try{

        //一些会抛出异常的语句

    }catch(Exception e){

         //处理该异常的代码块,这里可以使用 e.printStackTrace(); 来打印异常信息

    }finally{

        //无论是否发生异常都要执行的代码块

    }

异常的抛出

  • Throw:抛出自定义的异常

  • Throws:声明将要抛出何种类型的异常,把它抛出去让调用这个函数的上级调用函数进行处理

    public void 方法名(参数列表) throws 异常列表{
    
        //调用会抛出异常的方法或者抛出自定义异常
    
    }
    

异常是可以多重处理的,但是要注意顺序,子类异常在前,父类异常在后

try语句块不可以独立存在,必须与 catch 或者 finally 块同存

自定义异常

    class 自定义异常类  extends 异常类型{}

注意点:

  • Exception 是异常类,自定义异常类必要继承于 Exception 类或其子类

  • Exception 的父类是 Throwable

  • 捕获到的异常,可以在当前方法的 catch 块中处理,也可抛出给调用者去处理

Java中的异常链:(代码示例)

    public class Test {

        public static void main(String[] args) {


            Test t = new Test();
            try {
                t.test2();
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }

        public void test1() throws DrunkException{
            throw new DrunkException("喝车别开酒");
        }

        public void test2(){
            try {
                test1();
            } catch (DrunkException e) {
                RuntimeException newExc =new RuntimeException("司机一滴酒,亲人两行泪");
                newExc.initCause(e);
                throw newExc;
            }
        }
    }

实际应用中的经验总结:

  1. 处理运行时异常时,采用逻辑区合理规避同时辅助 try-catch 处理

  2. 在多重 catch 块后面,可以加一个 catch(Exception)来处理可能会被遗漏的异常

  3. 对于不确定的代码,也可以加上 try-catch ,处理潜在的异常

  4. 尽量去处理异常,切忌知识简单的而调用 printStackTrace() 去打印输出

  5. 具体如何去处理异常,要根据不同的业务需求和异常类型去决定

  6. 尽量添加finally语句块区释放占用的资源

2. Java 中的字符串

String 类型

Java 中,字符串被作为 String 类型的对象处理,String 类位于 java.lang 包中,默认情况下,该包被自动导入所有的程序。

String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如:

    String a = "welcome";
    a = a + "to Java";

字符串 a 被修改,指向了新的内存空间。

  • 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用 StringBuffer 或者 StringBuilder 类型

  • 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 “==” 比较时返回值仍然为 false ,如果只需比较内容是否相同,应使用 “equals” 方法。

String 类提供的常用方法

String 类提供了许多用来处理字符串的方法,例如,获取字符串长度,对字符串进行截取,将字符串转换为大写或小写、字符串分割等。

String 的常用方法代码实例:

    public class StringDemo {

        public static void main(String [] args) {

            String s = " abc def.ghij k@l好呀mn#op ql好吗st.uv wxyz  ";
            int a1 = s.length();
            int a2 = s.indexOf('.');
            int a3 = s.indexOf(".");
            int a4 = s.lastIndexOf('.');
            String a5 = s.substring(a2);
            String a6 = s.substring(a2, a4);
            String a7 = s.trim();
            String a8 = s.toUpperCase();
            String a9 = a8.toLowerCase();

            System.out.println(a1);
            System.out.println(a2);
            System.out.println(a3);
            System.out.println(a4);
            System.out.println(a5);
            System.out.println(a6);
            System.out.println(a7);
            System.out.println(a8);
            System.out.println(a9);

            String a[] = s.split(" ");//通过单个空格分割字符串
            int size = a.length;
            for(int i= 0;i<size;i++) {
                System.out.println(a[i]);
            }

        }
    }

双等号和equals()的区别:

  • “==”:判断两个字符串在内存中首地址是否相同,即判断是否时同一个字符串对象

  • Equals():比较两个字符串对象中存储的内容是否一致

Ps:字节时计算机存储信息的基本单位,1 个字节等于 8 位,gbk 编码中 1 个汉字字符存储需要 2 个字节,1 个英文字符存储需要 1 个字节。所以我们看到上面的程序运行结果中,每个汉字对应两个字节值,

StringBuilder 和 StringBuffer

在 java 中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串。

为什么要要使用 StringBuilder 或 StringBuffer ?

String类具有不可变性。也就是说String类型的变量在改变时其实是创建一个新的对象。因此当频繁操作字符串是,就会额外产生很多临时变量。而使用 StringBuilder 或 StringBuffer 就可以避免这个问题。

它们的区别?

StringBuilder 和 StringBuffer,他们基本相似,不同之处在于,StringBuffer 是线程安全的,而StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况瞎,如果需要创建一个内容可变的字符串对象,应有限考虑使用 StringBuilder 类。

定义 StringBuilder 类的对象的方法:

    StringBuilder str1 = new StringBuilder();  

    StringBuilder str2 = new StringBuilder(“imooc”);  

Java 中 StringBuilder 类的常用方法:

StringBuilder类提供了很多方法来操作字符串:

代码示例:

    StringBuilderstr = new StringBuilder(“hello”);

    str.append(“imooc”);//在字符串后面追加字符串

    str.append(123);//在字符串后面追加整数

    str.insert(11,”!”);//在指定位置插入内容

    String str2= str.toString();//转换为String对象

注意点:

  1. 字符串是对象

  2. 字符串具不变性

  3. String类提供了许多用来操作字符串的方法:连接,提取,查询等

  4. 在需要频繁对字符串进行修改操作时使用StringBuilder的效率比String高

3. Java 中的包装类:

八大基本数据类型:int,long.short,float,double,char,byte,Boolean

为什么要有包装类?

基本数据类型是不具备对象的特性的,比如基本类型不能调用方法,功能简单,为了让基本数据类型也具备对象的特性,java 为每个基本数据类型斗提供了一个包装类,这样我们就可以向操作对象那样来操作基本数据类型。

包装类主要提供两大类方法:

  1. 将本类型和其他基本类型进行类型转换的方法

  2. 将字符串和本类型及包装类互相转换的方法

我们以 Integer 包装类为例,来看下包装类的特性。

Integer包装类的构造方法:

    Integer(int value)    //创建一个Integer对象,表示指定的int值

    Integer(String s)    //创建一个Integer对象,表示String参数所指示的int值

示例如下:

    inti = 2;

    Integerm = new Integer(5);             //定义Integer包装类对象,值为5

    Integern = new Integer(“8”);          //定义Integer包装类对象,值为8

Java中基本类型和包装类之间的转换

               基本类型和包装类之间经常需要互相转换,以Integer为例(其他包装类类似)

               Integer a = new Integer(3);           //定义Integer包装类对象

               intb = a +5;               //将对象和基本类型进行运算

装箱和拆箱机制:

装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱

    int i = 10;

    Integer x = new Integer(i); //手动装箱

    Integer y = i; //自动装箱

拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱

    Integer j = new Integer(8);

    int m = j.intValue(); //手动拆箱

    int n = j; //自动拆箱

注意点:

  1. Integer 类型可以自动转化为 int 基本类型

  2. Int 类型对应的安装包是 java.lang.Integer

  3. long 类型可以自动转化为 Long 类型

  4. 基本类型 int 无法直接转换为安装包 Long 类型

4. Java 中基本类型和字符串之间的转换

在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。

其中,基本数据类型转换为字符串有三种方法:

  1. 使用包装类的 toString() 方法

  2. 使用 String 类的 valueOf() 方法

  3. 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串

示例如下:

    Int c = 10;

    String str1 = Integer.toString(c); //方法一

    String str2 = String.valueOf(c); //方法二

    String str3 = c +  "";          //方法三

字符串转换成基本类型有两种方法:

  1. 调用包装类的parseXXX 静态方法

  2. 调用包装类的valueOf()方法转换为基本类型的包装类,会自动拆箱

示例如下:

    String str = “8”;

    int d = Integer.parseInt(str);            //方法一

    int e = Integer.valueOf(str);              //方法二

注意点:

  1. 每一个基本数据类型都对应一个包装类

  2. 包装类都在java.lang包中

  3. 包装类提供了在不同类型间进行转换的方法

  4. 基本类型是不能调用方法的,而其包装类具有很多方法

5. 使用 Date 和 SimpleDateFormat 类表示时间

在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用:

     Dated = new Date();    //使用默认的构造方法创建Date对象

     System.out.println(d); //输出Date对象

使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间,显示的结果如下:Wed Jun 11 09:22:30CST 2014

其中,Wed 代表 Wednesday(星期三),Jun 代表 June(六月),11 代表 11 号,CST 代表 China Standard Time

从上面的输出结果中,我们发现,默认的时间格式不会很友好,与我们日常看到的日期格式不太一样,如果想要按指定的格式进行显示,如 2014-06-11 09:22:30,那该怎么做呢?此时就到了 java.text 包中的 SimpleDateFormat 类大仙身手的时候了,可以使用 SimpleDateFormat 来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。

  • 使用 Format() 方法将日期转换为指定格式的文本

    Date d = new Date();
    
    //创建 SimpleDateFormat 对象,指定目标格式
    
    SimpleDateFormat  sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    
    //调用 format() 方法,格式化时间,转换为指定格式字符串
    
    String today = sdf.format(d);
    
    System.out.println(today);
    

代码中的 “yyyy-MM-dd HH:mm:ss” 为预定字符串,yyyy 表示四位年,MM 表示两位月份,dd 表示两位日期,HH 表示小时(24小时制),mm 表示分钟,ss 表示秒,这样就指定了转换的目标格式,最后调用 format() 方法将时间转换为指定的格式的字符串。

运行的结果为:2014-06-11 09:55:48

  • 使用 parse() 方法将文本转换为日期

    String day = “2014年02月14日 10:30:25”;
    
    SimpleDateFormat df = new SimpleDateFormat(“yyyy年MM月dd日  HH:mm:ss”);
    
    //调用parse()方法,将字符串转化为日期
    
    Date date = df.parse(day);
    
    System.out.println(“当前时间:”+date);
    

运行结果:Fri Feb 14 10:30:25 CST 2014

注意点:

  1. 调用 SimpleDateFormat 对象的 parse() 方法时可能会出现转换异常,即 ParseException ,因此需要进行异常处理

  2. 使用 Date 类时需要导入 java.util 包,使用 SimpleDateFormat 时需要导入 java.text 包

6. Calendar类的应用

Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处理。

Java.util.Calendar 类时一个抽象类,可以通过调用 getlnstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如

    Calendar c = Calendar.getInstance();

那么如何使用 Calendar 获取年、月、日、时间等信息呢?我们来看下面的代码:

    Calendar c = Calendar.getInstance();    //创建Calendar对象

    int year = c.get(Calendar.YEAR);

    int month = c.get(Calendar.MONTH)+1;//获取月份,因为从0开始,所以加1

    int day = c.get(Calendar.DAY_OF_MONTH);//获取日期

    int minute = c.get(Calendar.MINUTE);

    int second = c.get(Calendar.SECOND);

其中,调用 Calendar 类的 getInstance() 方法获取一个实例,然后通过调用 get() 方法获取日期时间信息,参数为需要获得的字段的值,Calendar.Yea r等为 Calendar 类中定义的静态常量。

Calendar 类提供了 getTime() 方法,用来获取 Date 对象,完成 Calendar 和 Date 的转换,还可通过 getTimeInMillis() 方法,获取此 Calendar 的时间值,以毫秒为单位,如下所示:

    Date date = c.getTime();    //将 Calendar 对象转换为 Date 对象

    Long time = c.getTimeInMillis();      //获取当前毫秒数

    System.out.println(“当前时间:” + date);

    System.out.println(“当前毫秒数:” + time);

运行结果为:

    当前时间:Wed Jun 11 11:26:59 CST 2014

    当前毫秒数:1402457219381

猜你喜欢

转载自blog.csdn.net/baidu_33221362/article/details/81702598
今日推荐