枚举指由一组固定的常量组成的类型。
限定数据的取值,使数据更加安全,简单,易于理解。
每个基本类型在 java.lang 包中都有一个相应的包装类。
包装类把基本类型数据转换为对象,提供了一系列实用的方法。 集合不允许存放基本数据类型数据,存放数字时,要用包装类型。
所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例:
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 异常。
XXXValue():包装类转换成基本类型。
// 示例 Integer integerId = newInteger(25); int intId = integerId. intValue();toString():以字符串形式返回包装对象表示的基本类型数据。
// 示例 String sex = Character.toString('男'); String id = Integer.toString(25); // 等同于 String sex = '男'+""; String id = 25+"";parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)。
// 示例 int num = Integer.parseInt("36"); boolean bool = Boolean.parseBoolean("false");valueOf
所有包装类都有如下方法:
public static Type valueOf(type value) // 示例 Integer intValue = Integer.valueOf(21);除 Character 类外,其他包装类都有如下方法:
public static Type valueOf(String s) // 示例 Integer intValue = Integer.valueOf("21");装箱:基本类型转换为包装类的对象:包装类 . valueOf();。 拆箱:包装类对象转换为基本类型的值:包装类 . xxxValue();。 自动装箱、拆箱:
// JDK1.5之前是不支持自动装箱和自动拆箱的,定义 Integer对象,必须这样 Integer i = new Integer(8); // JDK1.5开始,提供了自动装箱的功能,定义 Integer对象可以这样 Integer i = 8; // 自动拆箱 int n = i;异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。Java编程语言使用异常处理机制为程序提供了错误处理的能力。
使用 try-catch 块捕获异常,分为三种情况:
若代码段 A 未产生异常,则程序在执行完代码段A后,直接执行代码段 C 。若代码段 A 产生异常,则产生异常对象,若异常对象匹配正确,则继续执行代码段 B、C ;若异常对象匹配不正确,则程序中断运行。调用异常对象的方法输出异常信息:
一段代码可能会引发多种类型的异常,当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句。执行其中一条 catch 语句后,其后catch 语句将被忽略。
// 示例 try { // 代码段(省略) } catch (InputMismatchException e) { System.err.println("被除数和除数必须是整数"); } catch (ArithmeticException e) { System.err.println("除数不能为零"); } catch (Exception e) { System.err.println("其他未知异常"); }在 try-catch 块后加入 finally 块,可以确保无论是否发生异常,finally 块中的代码总能被执行。
finally块中语句不执行的唯一情况——异常处理代码中执行 System.exit(1) 退出Java虚拟机
异常是一种特殊的对象,类型为 java.lang.Exception 或其子类。
Throwable:Exception 和 Error 类的父类Error:仅靠程序本身无法恢复的严重错误Exception:由Java应用程序抛出和处理的非严重错误Checked 异常(下图 Exception 左子树):程序必须处理该类异常运行时异常(下图 Exception 右子树):不要求程序必须对它们做出处理
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(); } } */所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
用户程序自定义的异常和应用程序特定的异常,必须借助于 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(); } } }throw 是语句抛出一个异常。 语法:throw (异常对象);
throw e;throws 是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常) 语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{…}
public void doA(int a) throws Exception1,Exception3{......}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,则该方法的调用者也要处理此异常。throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。 throws 句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
throws 主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。 throw 是具体向外抛异常的动作,所以它是抛出一个异常实例。
throws 说明你有那个可能、倾向。 throw 的话,那就是你把那个倾向变成真实的了。
两者都是消极处理异常的方式,这里的消极并不是说这种方式不好,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
