day13-常用API&异常

本文详细介绍Java中基本数据类型与包装类的概念及应用,包括类型转换、自动装箱拆箱等特性。同时深入探讨了日期类的使用,如Date、SimpleDateFormat、Calendar等类的构造方法与常用操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常用API

1.5 基本类型包装类

1.5.1 基本类型包装类概述

将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据
常用的操作之一:用于基本数据类型与字符串之间的转换

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

IntegerDemo.java

package com.itheima_01;

/*
    基本类型包装类
 */
public class IntegerDemo {
    public static void main(String[] args) {
        //需求:我要判断一个数据是否在 int 范围内?
        //public static final int MIN_VALUE
        //public static final int MAX_VALUE
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.MAX_VALUE);
    }
}

1.5.2 Integer 类的概述和使用

Integer:包装一个对象中的原始类型 int 的值

方法名说明
public Integer(int value)根据 int 值创建 Integer 对象**(过时)**
public Integer(String s)根据 String 值创建 Integer 对象**(过时)**
public static Integer valueOf(int i)返回表示指定的 int 值的 Integer 实例
public static Integer valueOf(String s)返回一个保存指定值的 Integer 对象 String

IntegerDemo.java

package com.itheima_02;

/*
    构造方法:
        public Integer(int value):根据 int 值创建 Integer 对象(过时)
        public Integer(String s):根据 String 值创建 Integer 对象(过时)

    静态方法获取对象:
        public static Integer valueOf​(int i):返回表示指定的 int 值的 Integer 实例
        public static Integer valueOf​(String s):返回一个保存指定值的 Integer 对象 String
 */
public class IntegerDemo {
    public static void main(String[] args) {
        //public Integer(int value):根据 int 值创建 Integer 对象(过时)
        Integer i1 = new Integer(100);
        System.out.println(i1);

        //public Integer(String s):根据 String 值创建 Integer 对象(过时)
        Integer i2 = new Integer("100");
//        Integer i2 = new Integer("abc"); //NumberFormatException
        System.out.println(i2);
        System.out.println("--------");

        //public static Integer valueOf​(int i):返回表示指定的 int 值的 Integer 实例
        Integer i3 = Integer.valueOf(100);
        System.out.println(i3);

        //public static Integer valueOf​(String s):返回一个保存指定值的 Integer 对象 String
        Integer i4 = Integer.valueOf("100");
        System.out.println(i4);
    }
}

1.5.3 int 和 String 的相互转换

基本类型包装类的最常见操作就是:用于基本类型和字符串之间的相互转换

  1. int 转换为 String
    public static String valueOf(int i):返回 int 参数的字符串表示形式。该方法是 String 类中的方法

  2. String 转换为 int
    public static int parseInt(String s):将字符串解析为 int 类型。该方法是 Integer 类中的方法

IntegerDemo.java

package com.itheima_03;

/*
    int和String的相互转换
 */
public class IntegerDemo {
    public static void main(String[] args) {
        //int --- String
        int number = 100;
        //方式1
        String s1 = number + "";
        System.out.println(s1);
        //方式2
        //public static String valueOf​(int i)
        String s2 = String.valueOf(number);
        System.out.println(s2);
        System.out.println("--------");

        //String --- int
        String s = "100";
        //方式1:String --- Integer --- int
        Integer i = Integer.valueOf(s);
        //public int intValue​()
        int x = i.intValue();
        System.out.println(x);
        //方式2
        //public static int parseInt​(String s)
        int y = Integer.parseInt(s);
        System.out.println(y);
    }
}

案例:字符串中数据排序

  • 需求:有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:“27 38 46 50 91”
  • 思路:
    1. 定义一个字符串
    2. 把字符串中的数字数据存储到一个int类型的数组中
      • 得到字符串中每一个数字数据?
        public String[] split(String regex)
      • 定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
        public static int parseInt(String s)
    3. 对 int 数组进行排序
    4. 把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
    5. 输出结果

IntegerTest.java

package com.itheima_03;

import java.util.Arrays;

/*
    需求:
        有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:“27 38 46 50 91”

    思路:
        1:定义一个字符串
        2:把字符串中的数字数据存储到一个int类型的数组中
            得到字符串中每一个数字数据?
                public String[] split(String regex)
            定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
                public static int parseInt​(String s)
        3:对 int 数组进行排序
        4:把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
        5:输出结果
 */
public class IntegerTest {
    public static void main(String[] args) {
        //定义一个字符串
        String s = "91 27 46 38 50";

        //把字符串中的数字数据存储到一个int类型的数组中
        String[] strArray = s.split(" ");
//        for(int i=0; i<strArray.length; i++) {
//            System.out.println(strArray[i]);
//        }

        //定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
        int[] arr = new int[strArray.length];
        for(int i=0; i<arr.length; i++) {
            arr[i] = Integer.parseInt(strArray[i]);
        }

        //对 int 数组进行排序
        Arrays.sort(arr);

        //把排序后的int数组中的元素进行拼接得到一个字符串,这里拼接采用StringBuilder来实现
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<arr.length; i++) {
            if(i == arr.length - 1) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i]).append(" ");
            }
        }
        String result = sb.toString();

        //输出结果
        System.out.println(result);
    }
}

1.5.4 自动装箱和拆箱

  • 装箱:把基本数据类型转换为对应的包装类类型
  • 拆箱:把包装类类型转换为对应的基本数据类型

Integer i = 100; // 自动装箱
i += 200; // i = i + 200; i + 200 自动拆箱;i = i + 200; 是自动装箱

注意:在使用包装类类型的时候,如果做操作,最好先判断是否为 null
我们推荐的是,只要是对象,在使用前就必须进行不为 null 的判断

IntegerDemo.java

package com.itheima_04;

/*
    装箱:把基本数据类型转换为对应的包装类类型
    拆箱:把包装类类型转换为对应的基本数据类型
 */
public class IntegerDemo {
    public static void main(String[] args) {
        //装箱:把基本数据类型转换为对应的包装类类型
        Integer i = Integer.valueOf(100);
        Integer ii = 100; //Integer.valueOf(100);

        //ii += 200;
        // ii = ii + 200;
        // ii = ii.intValue() + 200;
        // ii = 300;
        ii += 200;
        System.out.println(ii);

        Integer iii = null;
//        iii += 100; //NullPointerException
        if(iii != null) {
            iii += 100;
        }

    }
}

1.6. 日期类

1.6.1 Date 类概述和构造方法

Date 代表了一个特定的时间,精确到毫秒

方法名说明
public Date()分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
public Date(long date)分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数

DateDemo01.java

package com.itheima;

import java.util.Date;

/*
    public Date():分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
    public Date(long date):分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
 */
public class DateDemo01 {
    public static void main(String[] args) {
        //public Date():分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
        Date d1 = new Date();
        System.out.println(d1);

        //public Date(long date):分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
        long date = 1000*60*60;
        Date d2 = new Date(date);
        System.out.println(d2);
    }
}

1.6.2 Date 类的常用方法

方法名说明
public long getTime()获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
public void setTime(long time)设置时间,给的是毫秒值

DateDemo02.java

package com.itheima;

import java.util.Date;

/*
    public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
    public void setTime(long time):设置时间,给的是毫秒值
 */
public class DateDemo02 {
    public static void main(String[] args) {
        //创建日期对象
        Date d = new Date();

        //public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
//        System.out.println(d.getTime());
//        System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");

        //public void setTime(long time):设置时间,给的是毫秒值
//        long time = 1000*60*60;
        long time = System.currentTimeMillis();
        d.setTime(time);

        System.out.println(d);
    }
}

1.6.3 SimpleDateFormat 类概述

SimpleDateFormat 是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。我们重点学习日期格式化和解析

日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从‘A’到‘Z’以及从‘a’到‘z’引号的字母被解释为表示日期或时间字符串的组件的模式字母

常用的模式字母及对应关系如下:

  • y 年
  • M 月
  • d 日
  • H 时
  • m 分
  • s 秒

1.6.4 SimpleDateFormat 的构造方法

方法名说明
public SimpleDateFormat()构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern)构造一个SimpleDateFormat使用给定的模式和默认的日期格式

1.6.5 SimpleDateFormat 格式化和解析日期

  1. 格式化(从 Date 到 String )
    public final String format(Date date):将日期格式化成日期/时间字符串
  2. 解析(从 String 到 Date )
    public Date parse(String source):从给定字符串的开始解析文本以生成日期

SimpleDateFormatDemo.java

package com.itheima_01;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    构造方法:
        public SimpleDateFormat​():构造一个SimpleDateFormat,使用默认模式和日期格式
        public SimpleDateFormat​(String pattern):构造一个SimpleDateFormat使用给定的模式和默认的日期格式

    格式化:从 Date 到 String
        public final String format(Date date):将日期格式化成日期/时间字符串

    解析:从 String 到 Date
        public Date parse​(String source):从给定字符串的开始解析文本以生成日期
 */
public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {
        //格式化:从 Date 到 String
        Date d = new Date();
//        SimpleDateFormat sdf = new SimpleDateFormat();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s);
        System.out.println("--------");

        //从 String 到 Date
        String ss = "2048-08-09 11:11:11";
        //ParseException
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dd = sdf2.parse(ss);
        System.out.println(dd);
    }
}

案例:日期工具类

  • 需求:定义一个日期工具类(DateUtils),包含两个方法:把日期转换为指定格式的字符串;把字符串解析为指定格式的日期,然后定义一个测试类(DateDemo),测试日期工具类的方法
  • 思路:
    1. 定义日期工具类(DateUtils)
    2. 定义一个方法dateToString,用于把日期转换为指定格式的字符串
      • 返回值类型: String
      • 参数: Date date, String format
    3. 定义一个方法stringToDate,用于字符串解析为指定格式的日期
      • 返回值类型:Date
      • 参数:String s, String format
        定义测试类DateDemo,调用日期工
    4. 具类中的方法

DateUtils.java

package com.itheima_02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    工具类

    构造方法私有
    成员方法静态
 */
public class DateUtils {
    private DateUtils() {}

    /*
        把日期转为指定格式的字符串
        返回值类型:String
        参数:Date date, String format
     */
    public static String dateToString(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        String s = sdf.format(date);
        return s;
    }


    /*
        把字符串解析为指定格式的日期
        返回值类型:Date
        参数:String s, String format
     */
    public static Date stringToDate(String s, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date d = sdf.parse(s);
        return d;
    }

}

DateDemo.java

package com.itheima_02;

import java.text.ParseException;
import java.util.Date;

/*
    测试类
 */
public class DateDemo {
    public static void main(String[] args) throws ParseException {
        //创建日期对象
        Date d = new Date();

        String s1 = DateUtils.dateToString(d, "yyyy年MM月dd日 HH:mm:ss");
        System.out.println(s1);

        String s2 = DateUtils.dateToString(d, "yyyy年MM月dd日");
        System.out.println(s2);

        String s3 = DateUtils.dateToString(d, "HH:mm:ss");
        System.out.println(s3);
        System.out.println("--------");

        String s = "2048-08-09 12:12:12";
        Date dd = DateUtils.stringToDate(s, "yyyy-MM-dd HH:mm:ss");
        System.out.println(dd);
    }
}

1.6.6 Calendar 类概述

Calendar 为某一时刻和一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法

Calendar 提供了一个类方法 getInstance 用于获取 Calendar 对象,其日历字段已使用当前日期和时间初始化:Calendar rightNow = Calendar.getInstance();

CalendarDemo.java

package com.itheima_01;

import java.util.Calendar;

/*
    Calendar 为特定瞬间与一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法

    Calendar 提供了一个类方法 getInstance 用于获取这种类型的一般有用的对象,该方法返回一个 Calendar 对象,
    其日历字段已使用当前日期和时间初始化:Calendar rightNow = Calendar.getInstance();
 */
public class CalendarDemo {
    public static void main(String[] args) {
        //日历字段已使用当前日期和时间初始化
        Calendar c = Calendar.getInstance();

//        System.out.println(c);

        //public int get​(int field)
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int date = c.get(Calendar.DATE);

        System.out.println(year + "年" + (month + 1) + "月" + date + "日");

    }
}

1.6.7 Calendar 的常用方法

方法名说明
public int get(int field)返回给定日历字段的值
public abstract void add(int field, int amount)根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year,int month,int date)设置当前日历的年月日

CalendarDemo.java

package com.itheima_02;

import java.util.Calendar;

/*
    public abstract void add​(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
    public final void set​(int year,int month,int date):设置当前日历的年月日
 */
public class CalendarDemo {
    public static void main(String[] args) {
        //获取日历类对象
        Calendar c = Calendar.getInstance();

        //public int get​(int field):返回给定日历字段的值
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH) + 1;
        int date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

        //public abstract void add​(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
        //需求1:3年前的今天
//        c.add(Calendar.YEAR,-3);
//        year = c.get(Calendar.YEAR);
//        month = c.get(Calendar.MONTH) + 1;
//        date = c.get(Calendar.DATE);
//        System.out.println(year + "年" + month + "月" + date + "日");

        //需求2:10年后的10天前
//        c.add(Calendar.YEAR,10);
//        c.add(Calendar.DATE,-10);
//        year = c.get(Calendar.YEAR);
//        month = c.get(Calendar.MONTH) + 1;
//        date = c.get(Calendar.DATE);
//        System.out.println(year + "年" + month + "月" + date + "日");

        //public final void set​(int year,int month,int date):设置当前日历的年月日
        c.set(2050,10,10);
        year = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH) + 1;
        date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

    }
}

案例:二月天

  • 需求:获取任意一年的二月有多少天

  • 思路:

    1. 键盘录入任意的年份
    2. 设置日历对象的年、月、日
      • 年:来自于键盘录入
      • 月:设置为3月,月份是从0开始
      • 的,所以设置的值是2
      • 日:设置为1日
    3. 3月1日往前推一天,就是2月的最后一天
    4. 获取这一天输出即可

CalendarTest.java

package com.itheima_03;

import java.util.Calendar;
import java.util.Scanner;

/*
    需求:
        获取任意一年的二月有多少天

    思路:
        1:键盘录入任意的年份
        2:设置日历对象的年、月、日
            年:来自于键盘录入
            月:设置为3月,月份是从0开始的,所以设置的值是2
            日:设置为1日
        3:3月1日往前推一天,就是2月的最后一天
        4:获取这一天输出即可
 */
public class CalendarTest {
    public static void main(String[] args) {
        //键盘录入任意的年份
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年:");
        int year = sc.nextInt();

        //设置日历对象的年、月、日
        Calendar c = Calendar.getInstance();
        c.set(year, 2, 1);

        //3月1日往前推一天,就是2月的最后一天
        c.add(Calendar.DATE, -1);

        //获取这一天输出即可
        int date = c.get(Calendar.DATE);
        System.out.println(year + "年的2月份有" + date + "天");
    }
}

2.异常

2.1 异常概述

异常:就是程序出现了不正常的情况

异常体系
在这里插入图片描述
Error:严重问题,不需要处理
Exception:称为异常类,它表示程序本身可以处理的问题

  • RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码
  • 非 RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了

ExceptionDemo01.java

package com.itheima_01;

/*
    异常
 */
public class ExceptionDemo01 {
    public static void main(String[] args) {
        method();
    }

    public static void method() {
        int[] arr = {1, 2, 3};
//        System.out.println(arr[1]);
//        System.out.println(arr[3]); //ArrayIndexOutOfBoundsException
        System.out.println(arr[2]);
    }
}

2.1.2 JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终 JVM 会做默认的处理

  • 把异常的名称,异常原因及异常出现的
  • 位置等信息输出在了控制台
    程序停止执行

ExceptionDemo02.java

package com.itheima_01;

/*
    JVM的默认处理方案
 */
public class ExceptionDemo02 {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }

    public static void method() {
        int[] arr = {1, 2, 3};
//        System.out.println(arr[1]);
        System.out.println(arr[3]);
    }
}
/*
开始
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at com.itheima_01.ExceptionDemo02.method(ExceptionDemo02.java:16)
	at com.itheima_01.ExceptionDemo02.main(ExceptionDemo02.java:9)
 */

2.1.3 异常处理

如果程序出现了问题,我们需要自己来处理,有两种方案:

  • try … catch …
  • throws

2.1.4 异常处理之 try…catch…

  • 格式:

格式:
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}

执行流程:
程序从 try 里面的代码开始执行
出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行

ExceptionDemo01.java

package com.itheima_02;

/*
    try {
        可能出现异常的代码;
    } catch(异常类名 变量名) {
        异常的处理代码;
    }
 */
public class ExceptionDemo01 {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }

    public static void method() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
            System.out.println("这里能够访问到吗");
        } catch (ArrayIndexOutOfBoundsException e) {
//            System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
            e.printStackTrace();
        }
    }
}

2.1.5 Throwable 的成员方法

方法名说明
public String getMessage()返回此 throwable 的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

ExceptionDemo02.java

package com.itheima_02;

/*
    public String getMessage():返回此 throwable 的详细消息字符串
    public String toString():返回此可抛出的简短描述
    public void printStackTrace():把异常的错误信息输出在控制台
 */
public class ExceptionDemo02 {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }

    public static void method() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
            System.out.println("这里能够访问到吗");
        } catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
//            e.printStackTrace();

            //public String getMessage():返回此 throwable 的详细消息字符串
//            System.out.println(e.getMessage());
            //Index 3 out of bounds for length 3

            //public String toString():返回此可抛出的简短描述
//            System.out.println(e.toString());
            //java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

            //public void printStackTrace():把异常的错误信息输出在控制台
            e.printStackTrace();
//            java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//            at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
//            at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)


        }
    }
}

/*
    public class Throwable {
        private String detailMessage;

        public Throwable(String message) {
            detailMessage = message;
        }

        public String getMessage() {
            return detailMessage;
        }
    }
 */

2.1.6 编译时异常和运行时异常的区别

Java 中的异常被分为两大类:编译时异常运行时异常,也被称为受检异常非受检异常
所有的 RuntimeException 类及其子类被称为运行时异常,其他的异常都是编译时异常

  • 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常:无需显示处理,也可以和编译时异常一样处理

ExceptionDemo03.java

package com.itheima_02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    Java 中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常
    所有的 RuntimeException 类及其子类的实例被称为运行时异常,其他的异常都是编译时异常

    编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
    运行时异常:无需显示处理,也可以和编译时异常一样处理
 */
public class ExceptionDemo03 {
    public static void main(String[] args) {
//        method();
        method2();
    }

    //编译时异常
    public static void method2() {
        try {
            String s = "2048-08-09";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date d = sdf.parse(s);
            System.out.println(d);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    //运行时异常
    public static void method() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }

}

2.1.7 异常处理之 throws

虽然我们通过 try…catch…可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理
也就是说,有些时候可能出现的异常是我们处理不了的,这个时候该怎么办呢?
针对这种情况,Java 提供了 throws 的处理方案

格式:

throws 异常类名;

**注意:**这个格式是跟在方法的括号后面的

  • 编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,将来谁调用谁处理
  • 运行时异常可以不处理,出现问题后,需要我们回来修改代码

ExceptionDemo.java

package com.itheima_03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    throws 异常类名;
    这个格式是跟在方法的括号后面的
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
//        method();
        try {
            method2();
        }catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }

    //编译时异常
    public static void method2() throws ParseException {
        String s = "2048-08-09";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s);
        System.out.println(d);
    }

    //运行时异常
    public static void method() throws ArrayIndexOutOfBoundsException {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);
    }

}

2.1.8 自定义异常

格式:

public class 异常类名 extends Exception {
无参构造
带参构造
}

范例:

public class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message) {
super(message);
}
}

ScoreException.java

package com.itheima_04;

public class ScoreException extends Exception {

    public ScoreException() {}

    public ScoreException(String message) {
        super(message);
    }

}

Teacher.java

package com.itheima_04;

public class Teacher {

    public void checkScore(int score) throws ScoreException {
        if(score<0 || score>100) {
//            throw new ScoreException();
            throw new ScoreException("你给的分数有误,分数应该在0-100之间");
        } else {
            System.out.println("成绩正常");
        }
    }

}

Demo.java

package com.itheima_04;

import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入分数:");

        int score = sc.nextInt();

        Teacher t = new Teacher();
        try {
            t.checkScore(score);
        } catch (ScoreException e) {
            e.printStackTrace();
        }
    }
}

2.1.9 throws 和 throw 的区别

throws

  • 用在方法声明后面,跟的是异常类名
  • 表示抛出异常,由该方法的调用者来处理
  • 表示出现异常的一种可能性,并不一定会发生这些异常

throw

  • 用在方法体内,跟的是异常对象名
  • 表示抛出异常,由方法体内的语句处理
  • 执行 throw 一定抛出了某种异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值