Java基础 -- 枚举、包装类、异常

一、枚举

1. 定义

枚举指由一组固定的常量组成的类型。

2. 实现

// 枚举类
public enum Gender{
male,female
}
	
// 使用
public class Student{
	Gender sex;

	public Student(){
		sex = Gender.male;
	}
}

3. 意义

限定数据的取值,使数据更加安全,简单,易于理解。

二、包装类

1. 定义

每个基本类型在 java.lang 包中都有一个相应的包装类。

2. 作用

包装类把基本类型数据转换为对象,提供了一系列实用的方法。
集合不允许存放基本数据类型数据,存放数字时,要用包装类型。

3. 分类

在这里插入图片描述

4. 构造包装类的实例

所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例:

public Type(type value)
// 示例
Integer i = new Integer(1);

除 Character 类外,其他包装类可将一个字符串作为参数构造它们的实例:

public Type(String value)
// 示例
Integer i = new Integer("123");

Boolean 类构造方法参数为 String 类型时,若该字符串内容为 true (不考虑大小写),则该 Boolean对象表示 true ,否则表示 false 。

当 Number 包装类构造方法参数为 String 类型时,字符串不能为 null ,且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,运行时 NumberFormatException 异常

5. 包装类转为基本类型

XXXValue():包装类转换成基本类型。
在这里插入图片描述

// 示例
Integer integerId = newInteger(25);
int intId = integerId. intValue();

6. 基本类型转为字符串

toString():以字符串形式返回包装对象表示的基本类型数据。

// 示例
String sex = Character.toString('男');
String id = Integer.toString(25);

// 等同于
String sex = '男'+"";
String id = 25+"";

7. 字符串转为基本类型

parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)。

// 示例
int num = Integer.parseInt("36");
boolean bool = Boolean.parseBoolean("false");

8. 基本类型或字符串转为包装类

valueOf

8.1 基本类型转为包装类

所有包装类都有如下方法:

public static Type valueOf(type value)
// 示例
Integer intValue = Integer.valueOf(21);

8.2 字符串转为包装类

除 Character 类外,其他包装类都有如下方法:

public static Type valueOf(String s)
// 示例
Integer intValue = Integer.valueOf("21");

9. 拆箱和装箱(基本类型和包装类的自动转换)

装箱:基本类型转换为包装类的对象:包装类 . valueOf();。
拆箱:包装类对象转换为基本类型的值:包装类 . xxxValue();。
自动装箱、拆箱:

// JDK1.5之前是不支持自动装箱和自动拆箱的,定义 Integer对象,必须这样
Integer i = new Integer(8);
 
// JDK1.5开始,提供了自动装箱的功能,定义 Integer对象可以这样
Integer i = 8;

// 自动拆箱
int n = i;

10. 包装类的特点

  • JDK1.5后,允许基本数据类型和包装类型进行混合数学运算
  • 包装类并不是用来取代基本数据类型的
  • 在基本数据类型需要用对象表示时使用

三、异常

1. 定义

异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。Java编程语言使用异常处理机制为程序提供了错误处理的能力。

2. JAVA中如何进行异常处理

在这里插入图片描述

2. try-catch 块

public void method(){
try {
	// 代码段 A
} catch (异常类型 变量e) {
	// 对异常进行处理的代码段 B
}
// 代码段 C
}

使用 try-catch 块捕获异常,分为三种情况:

  • 若代码段 A 未产生异常,则程序在执行完代码段A后,直接执行代码段 C 。
  • 若代码段 A 产生异常,则产生异常对象,若异常对象匹配正确,则继续执行代码段 B、C ;若异常对象匹配不正确,则程序中断运行。

3. 在catch块中处理异常

调用异常对象的方法输出异常信息:
在这里插入图片描述

4. 多重CATCH块

一段代码可能会引发多种类型的异常,当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句。执行其中一条 catch 语句后,其后catch 语句将被忽略。

// 示例
try {
	// 代码段(省略)
} catch (InputMismatchException e) {
	System.err.println("被除数和除数必须是整数");
} catch (ArithmeticException e) {
	System.err.println("除数不能为零");
} catch (Exception e) {
	System.err.println("其他未知异常");
}

5. finally 块

在 try-catch 块后加入 finally 块,可以确保无论是否发生异常,finally 块中的代码总能被执行。

finally块中语句不执行的唯一情况——异常处理代码中执行 System.exit(1) 退出Java虚拟机

6. 常见的异常类型

异常是一种特殊的对象,类型为 java.lang.Exception 或其子类。

  • Throwable:Exception 和 Error 类的父类
  • Error:仅靠程序本身无法恢复的严重错误
  • Exception:由Java应用程序抛出和处理的非严重错误
  • Checked 异常(下图 Exception 左子树):程序必须处理该类异常
  • 运行时异常(下图 Exception 右子树):不要求程序必须对它们做出处理

在这里插入图片描述
在这里插入图片描述

7. 声明异常

Java语言中通过 throws 声明某个方法可能抛出的各种异常,若同时声明多个异常,之间由逗号隔开。

public class Test7 {
	// divide()方法没有处理异常,而是声明异常
	public static void divide() throws Exception {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		int num1 = in.nextInt();
		System.out.print("请输入除数:");
		int num2 = in.nextInt();
		System.out.println(String.format("%d / %d = %d",
		num1, num2, num1/ num2));
	}

	// 方式1:调用者通过 try-catch 捕获并处理异常
	public static void main(String[] args) {
		try {
			divide();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/* 方式2:调用者通过 throws 继续声明异常
	public static void main(String[] args) throws Exception {
		divide();
	}
}
*/

8. 抛出异常

8.1 系统自动抛出的异常

所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。

8.2 语句抛出的异常

用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。

public class Person {
	private String name = "";// 姓名
	private int age = 0;// 年龄
	private String sex = "男";// 性别
	
	public void setSex(String sex) throws Exception {
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		}else {
			throw new Exception("性别必须是“男”或者“女”!");
		}
	}
	public void print() {
		System.out.println(this.name + "(" + this.sex
		+ "," + this.age + "岁)");
	}
}

public class Test8 {
	public static void main(String[] args) {
		Person person = new Person();
		try {
			person.setSex("Male");
			person.print();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

9. throw 和 throws 的区别

9.1 throw

throw 是语句抛出一个异常。
语法:throw (异常对象);

 throw e;

9.2 throws

throws 是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{…}

public void doA(int a) throws Exception1,Exception3{......}

9.3 举例

throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常 E1,E2,E3 可能是该函数体产生的。

throw则是明确了这个地方要抛出这个异常。

// 示例 
void doA(int a) throws Exception1,Exception3{
	try{
	......
	
	}catch(Exception1 e) {
		throw e;
	}catch(Exception2 e) {
		System.out.println("出错了!");
	}
	if(a!=b) {
		throw new  Exception3("自定义异常");
	}
}

代码块中可能会产生3个异常( Exception1、Exception2、Exception3 )。

  • 如果产生 Exception1 异常,则捕获之后再抛出,由该方法的调用者去处理。
  • 如果产生 Exception2 异常,则该方法自己处理了( 即 System.out.println(“出错了!”); )。所以该方法就不会再向外抛出 Exception2 异常了,void doA() throws Exception1, Exception3 里面的 Exception2 也就不用写了。
  • 而 Exception3 异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常 Exception3,则该方法的调用者也要处理此异常。

9.4 对比

  • throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    throws 句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

  • throws 主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
    throw 是具体向外抛异常的动作,所以它是抛出一个异常实例。

  • throws 说明你有那个可能、倾向。
    throw 的话,那就是你把那个倾向变成真实的了。

  • 两者都是消极处理异常的方式,这里的消极并不是说这种方式不好,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值