(1-5)Java 常用工具类、包装类、StringStringBuilderString
目录
1. 异常
1.1 什么是异常?
1.2 异常的分类
1.3 异常处理机制
1.4 try-catch-finally
1.5 throw & throws
1.5.1 throws
1.5.2 throw
1.6 自定义异常
1.7 异常链
1.8 异常总结
2. 包装类
2.1 概述
2.2 基本数据类型和包装类之间的转换(装箱&拆箱)
2.3 基本数据类型和字符串之间的转换
2.4 包装类&基本数据类型的初始值
2.5 包装类对象之间的比较
解决的问题:
1. 异常
(1)什么是异常?
(2)如何处理异常?
- try-catch-finally
- throw
- throws
- 自定义异常
- 异常链
1.1 什么是异常?
- 异常本质上是程序上的错误。
- 在程序运行过程中,意外发生的情况,背离程序本身意图的表现
(1)编译期间的异常
(2)运行期间的异常
1.2 异常的分类
1.3 异常处理机制
异常处理机制可分为抛出异常 & puzuo异常
1.4 try-catch-finally
异常案例:
public class TryDemoOne {public static void main(String[] args) {//要求:定义两个整数,接受用户的键盘输入,输出两数之商Scanner sc = new Scanner(System.in);int x1 = sc.nextInt();int x2 = sc.nextInt();System.out.println("result is " + x1/x2);/* 正常结果194result is 4*//* 异常1:除0190Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.vb.exception.TryDemoOne.main(TryDemoOne.java:11)*//* 异常2: 出入格式错误异常wException in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.vb.exception.TryDemoOne.main(TryDemoOne.java:9)*/}
}
try-catch-finally处理案例:
public class TryDemoOne {public static void main(String[] args) {//要求:定义两个整数,接受用户的键盘输入,输出两数之商Scanner sc = new Scanner(System.in);try{// 编写可能出现异常的代码 -->铺货异常int x1 = sc.nextInt();int x2 = sc.nextInt();System.out.println("result is " + x1/x2);}catch(Exception e){// 打印错误的堆栈信息 -->抛出异常e.printStackTrace();System.out.println("程序出错了");}finally {// 无论catch中的内容执行与否,finally中的内容都会执行System.out.println("运行结束");}/*** 89* 0* java.lang.ArithmeticException: / by zero* at com.vb.exception.TryDemoOne.main(TryDemoOne.java:41)* 程序出错了* 运行结束*//*** 90* s* java.util.InputMismatchException* at java.util.Scanner.throwFor(Scanner.java:864)* at java.util.Scanner.next(Scanner.java:1485)* at java.util.Scanner.nextInt(Scanner.java:2117)* at java.util.Scanner.nextInt(Scanner.java:2076)* at com.vb.exception.TryDemoOne.main(TryDemoOne.java:40)* 程序出错了* 运行结束*/}
}
具体多类型异常抛出
// catch模块改进try{// 编写可能出现异常的代码 -->铺货异常int x1 = sc.nextInt();int x2 = sc.nextInt();System.out.println("result is " + x1/x2);}catch(ArithmeticException e){// 打印错误的堆栈信息 -->抛出异常System.out.println("Arithmetic exception,除数不允许为0!");e.printStackTrace();}catch(InputMismatchException e){// 打印错误的堆栈信息 -->抛出异常System.out.println("请输入整数");e.printStackTrace();}catch(Exception e){e.printStackTrace();} finally {// 无论catch中的内容执行与否,finally中的内容都会执行System.out.println("运行结束");}/*900Arithmetic exception,除数不允许为0!运行结束java.lang.ArithmeticException: / by zeroat com.vb.exception.TryDemoOne.main(TryDemoOne.java:79)*//*90e请输入整数运行结束java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.vb.exception.TryDemoOne.main(TryDemoOne.java:78)*/}
System.exit();
try{// 编写可能出现异常的代码 -->铺货异常int x1 = sc.nextInt();int x2 = sc.nextInt();System.out.println("result is " + x1/x2);}catch(ArithmeticException e){// 打印错误的堆栈信息 -->抛出异常System.exit(1); // 中止程序运行//12//0System.out.println("Arithmetic exception,除数不允许为0!");e.printStackTrace();}
不建议finally中编写return
public class TryDemoTwo {public static int test(){Scanner sc = new Scanner(System.in);try{// 编写可能出现异常的代码 -->铺货异常int x1 = sc.nextInt();int x2 = sc.nextInt();return x1/x2;}catch(ArithmeticException e){// 打印错误的堆栈信息 -->抛出异常System.out.println("Arithmetic exception,除数不允许为0!");return 0;} finally {// 无论catch中的内容执行与否,finally中的内容都会执行System.out.println("运行结束");return -100;}}public static void main(String[] args) {int result = test();System.out.println("x1和x2的商为:"+ result); // 7}/*不建议finally 中写return*//*235运行结束x1和x2的商为:-100*//*120Arithmetic exception,除数不允许为0!运行结束x1和x2的商为:-100*/
}
1.5 throw & throws
可以通过throws声明将要抛出何种类型的异常,通过throw将产生的异常抛出
throws:
如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处调用throws子句来声明抛出异常。
1.5.1 throws
public class TryDemoThrows {/*通过throws 抛出异常时,正对可能出现的多种异常情况,解决方案1. throws 后边接入多个异常类型2. throws 后边直接写Exception*//*** 测试接受数据相除结果结果的方法* @return 两个接受数据的商* @throws ArithmeticException* @throws InputMismatchException*/public static int test() throws ArithmeticException, InputMismatchException {Scanner sc = new Scanner(System.in);int x1 = sc.nextInt();int x2 = sc.nextInt();System.out.println("运行结束");return x1/x2;}// public static int test() throws Exception {
// Scanner sc = new Scanner(System.in);
// int x1 = sc.nextInt();
// int x2 = sc.nextInt();
// System.out.println("运行结束");
// return x1/x2;
// }public static void main(String[] args) {try{int result = test();System.out.println("x1和x2的商为:"+ result);}catch (ArithmeticException e){System.out.println("除数不允许为0");e.printStackTrace();}catch (InputMismatchException e){System.out.println("输入应为zhengshu");e.printStackTrace();}catch (Exception e){e.printStackTrace();}}/*re输入应为zhengshujava.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.vb.exception.TryDemoThrows.test(TryDemoThrows.java:10)at com.vb.exception.TryDemoThrows.main(TryDemoThrows.java:18)*//*450运行结束除数不允许为0java.lang.ArithmeticException: / by zeroat com.vb.exception.TryDemoThrows.test(TryDemoThrows.java:13)at com.vb.exception.TryDemoThrows.main(TryDemoThrows.java:18)*/
}
1.5.2 throw
- throw用来抛出一个异常
- 例如: throw new IOException();
- throw抛出的只能够是可抛出Throwable 或者其子类的实例对象
- 例如: throw new String("出错了");错误编写。
- throw可以规避可能出现的风险,完成一些程序的逻辑
案例代码:
/*** 需求: 酒店入住规则* 限定年龄,18岁以下\80岁以上的住客必须有亲友陪同** throw 抛出异常对象的处理方案* 1. 通过try..catch 包含throw语句 -- 自己抛出,自己处理* 2. 通过throws在方法声明处抛出异常 -- 谁调用谁处理-- 调用者可以自己处理,可以继续向上抛出2-2 可以抛出与throw对象相同的类型或者让父类*/
方案一:通过try..catch 包含throw语句 -- 自己抛出,自己处理
public static void testAge() {try {System.out.println("请输入住客年龄");Scanner sc = new Scanner(System.in);int age = sc.nextInt();if (age < 18 || age > 80) {throw new Exception("18岁以下\\80岁以上的住客必须有亲友陪同");} else {System.out.println("可以入住");}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {testAge();/*请输入住客年龄89java.lang.Exception: 18岁以下\80岁以上的住客必须有亲友陪同at com.vb.exception.ThrowDemo.testAge(ThrowDemo.java:18)at com.vb.exception.ThrowDemo.main(ThrowDemo.java:29)*/}
方案2: 通过throws在方法声明处抛出异常 -- 谁调用谁处理
// 方案2: 2. 通过throws在方法声明处抛出异常 -- 谁调用谁处理public static void testAge() throws Exception{System.out.println("请输入住客年龄");Scanner sc = new Scanner(System.in);int age = sc.nextInt();if (age < 18 || age > 80) {throw new Exception("18岁以下\\80岁以上的住客必须有亲友陪同");} else {System.out.println("可以入住");}}public static void main(String[] args) {try {testAge();} catch (Exception e) {e.printStackTrace();}/*请输入住客年龄90java.lang.Exception: 18岁以下\80岁以上的住客必须有亲友陪同at com.vb.exception.ThrowDemo.testAge(ThrowDemo.java:41)at com.vb.exception.ThrowDemo.main(ThrowDemo.java:63)*/}
方案2-2:throws: Throwable
//方案2-2public static void testAge() throws Throwable{System.out.println("请输入住客年龄");Scanner sc = new Scanner(System.in);int age = sc.nextInt();if (age < 18 || age > 80) {throw new Exception("18岁以下\\80岁以上的住客必须有亲友陪同");} else {System.out.println("可以入住");}}public static void main(String[] args) {try {testAge();
// } catch (Exception e) {} catch (Throwable e) {e.printStackTrace();}/*请输入住客年龄90java.lang.Exception: 18岁以下\80岁以上的住客必须有亲友陪同at com.vb.exception.ThrowDemo.testAge(ThrowDemo.java:41)at com.vb.exception.ThrowDemo.main(ThrowDemo.java:63)*/}
1.6 自定义异常
自定义异常类:
public class HotelAgeException extends Exception{public HotelAgeException(){super("18岁以下\\80岁以上的住客必须有亲友陪同");}
}
测试类
public class HotelExceptionTest {public static void testAge() throws HotelAgeException{System.out.println("请输入住客年龄");Scanner sc = new Scanner(System.in);int age = sc.nextInt();if (age < 18 || age > 80) {throw new HotelAgeException();} else {System.out.println("可以入住");}}public static void main(String[] args) {try{testAge();}catch (HotelAgeException e){System.out.println(e.getMessage());System.out.println("酒店人员不能办理入住");}catch (Exception e){e.printStackTrace();}/*01请输入住客年龄23可以入住*//*02请输入住客年龄ujava.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.vb.exception.HotelExceptionTest.testAge(HotelExceptionTest.java:10)at com.vb.exception.HotelExceptionTest.main(HotelExceptionTest.java:20)*//*03请输入住客年龄9818岁以下\80岁以上的住客必须有亲友陪同酒店人员不能办理入住*/}
}
1.7 异常链
public class ExceptionLine {public static void main(String[] args){try {testThree();} catch (Exception e) {e.printStackTrace();/* (正常的异常链中只保留了最后一个异常信息,可以通过配置将所有的异常堆栈信息保留下来)java.lang.Exception: testThree 新产生的异常at com.vb.exception.ExceptionLine.testThree(ExceptionLine.java:29)at com.vb.exception.ExceptionLine.main(ExceptionLine.java:7)*//* 通过方式1&2保留完整的异常堆栈信息java.lang.Exception: testThree 新产生的异常at com.vb.exception.ExceptionLine.testThree(ExceptionLine.java:43)at com.vb.exception.ExceptionLine.main(ExceptionLine.java:7)Caused by: java.lang.Exception: testTwo 新产生的异常at com.vb.exception.ExceptionLine.testTwo(ExceptionLine.java:31)at com.vb.exception.ExceptionLine.testThree(ExceptionLine.java:38)... 1 moreCaused by: com.vb.exception.HotelAgeException: 18岁以下\80岁以上的住客必须有亲友陪同at com.vb.exception.ExceptionLine.testOne(ExceptionLine.java:21)at com.vb.exception.ExceptionLine.testTwo(ExceptionLine.java:26)... 2 more*/}}public static void testOne() throws HotelAgeException{throw new HotelAgeException();}public static void testTwo() throws Exception{try{testOne();}catch(HotelAgeException e){
// throw new Exception("testTwo 新产生的异常");// 保留异常链之前的异常信息// 方式一: 抛出的异常加上异常参数throw new Exception("testTwo 新产生的异常", e);}}public static void testThree()throws Exception{try{testTwo();}catch(Exception e){
// throw new Exception("testThree 新产生的异常");
// throw new Exception("testThree 新产生的异常", e);// 方式2: 在构造方法中描述字符串信息Exception e1 = new Exception("testThree 新产生的异常");e1.initCause(e);throw e1;}}
}
1.8 异常总结
2. 包装类
- 什么是包装类?
- 包装类和基本数据类型之间的对应关系
- 包装类的常用方法
2.1 概述
- 由于基本数据类型没有属性方法, 无法和对象进行交互
- 包装类是拥有属性、方法,以及可以和对象进行交互
- 基本上数据类型和包装类的对应关系
2.2 基本数据类型和包装类之间的转换(装箱&拆箱)
装箱& 拆箱Code
public class WrapProj {public static void main(String[] args) {// 1.装箱: 把基本数据类型转换成包装类// 1.1 自动装箱int t1 = 6;Integer t2 = t1;// 1.2 手动装箱Integer t3 = new Integer(t1);// testSystem.out.println("int类型变量t1= " + t1); // int类型变量t1= 6System.out.println("Integer类型对象t2= " + t2); // Integer类型对象t2= 6System.out.println("Integer类型对象t3= " + t3 ); // Integer类型对象t3= 6// 2,拆箱 :把包装类转换成基本数据类型// 2.1 自动拆箱int t4 = t2;// 2.2 手动拆箱int t5 = t2.intValue();// testSystem.out.println("Integer 类型对象t2= "+t2); //Integer 类型对象t2= 6System.out.println("自动拆箱后, int类型变量 t4=" +t4); //自动拆箱后, int类型变量 t4=6System.out.println("手动拆箱后,int类型变量 t5 =" +t5); //手动拆箱后,int类型变量 t5 =6}
2.3 基本数据类型和字符串之间的转换
-
String t2 = Integer.toString(t1);
-
int t3 = Integer.parseInt(t2);
-
int t4 = Integer.valueOf(t2);
代码演示:
public class WrapDemo02 {public static void main(String[] args) {// 01 .将基本上数据类型转换成字符串int t1 = 2;String t2 = Integer.toString(t1);// testSystem.out.println("int类型转换为String类型对象t2= " + t2); // int类型转换为String类型对象t2= 2System.out.println("========================");// 02. 字符串转换成基本数据类型// 2.1 包装类的parseint t3 = Integer.parseInt(t2);// 2.2 包装类的valueOf 先将字符串转换为包装类, 再通过自动拆箱完成基本类型转换int t4 = Integer.valueOf(t2);// testSystem.out.println("String类型转换为int类型变量t3= "+ t3); //String类型转换为int类型变量t3= 2System.out.println("String类型转换为int类型变量t4= "+ t4); //String类型转换为int类型变量t4= 2}
}
2.4 包装类&基本数据类型的初始值
包装类的数据初始值为null
代码演示:
public class Cat {private String name;private Integer month;private Double weight;public static void main(String[] args) {Cat cat = new Cat();System.out.println("String name: "+ cat.name); //String name: nullSystem.out.println("int month: "+ cat.month); //int month: 0System.out.println("double weight: "+ cat.weight); //double weight: 0.0System.out.println("Integer month: "+ cat.month); //Integer month: nullSystem.out.println("Double weight: "+ cat.weight); //Double weight: null}
}
2.5 包装类对象之间的比较
3.String&StringBuilder&StringBuffer
- 如何创建String对象
- String对象的常用方法
- ==和equals的区别
- String的不可变性
1.创建String对象的(3种)方法
2.String对象的常用方法(!!!)
(1)length & subString & charAt
public class length_subString_charAt {public static void main(String[] args) {String str = new String("vb 学 Java 真爽 !!");System.out.println(str.length()); //15System.out.println(str.charAt(3)); //学System.out.println(str.substring(3));//学 Java 真爽 !!// 截止到 下标15 之前System.out.println(str.substring(3, 15));//学 Java 真爽 !!}
}
(2)indexOf & lastIndexOf
public class indexOf_lastIndexOf {public static void main(String[] args) {String str = new String();str = "phdvb need more vb & give more vb";// 查找'v' 在字符串种第一次出现的下表位置 (数组下标)System.out.println(str.indexOf('v')); //3// 查找"need" 在字符串第一次出现的位置System.out.println(str.indexOf("need")); //6// 查找'v' 在字符串种最后一次出现的下表位置System.out.println(str.lastIndexOf('v')); //31// 查找"vb" 在字符串种最后一次出现的下表位置System.out.println(str.lastIndexOf("vb")); //31// 从下标为10的位置开始,查找"vb" 在字符串种第一次出现的下表位置System.out.println(str.indexOf("vb", 10)); //16System.out.println(str.indexOf("vc")); //-1System.out.println(str.indexOf('u')); //-1}
}
1
解决的问题:
1. Java常用工具类(难度:1)
2. 如何应用异常处理程序中的问题(1)
3. 如何通过包装器类实现基本数据类型的对象化处理(1)
4. String、StringBuilder是如何进行字符串信息操作的(1)
5. 常用集合框架及实现类使用(3)
6. 如何使用Java输入输出流文件进行读写(5)
7. 如何使用多线程实现数据并发通信(10)
1