java第七至九章复习

一、异常与异常处理
1. 异常简介
在Java中,**异常是程序在执行过程中出现的问题或意外情况,导致程序无法按照预期的流程进行。**异常处理是Java中用于处理程序中出现的异常的一种机制。

Java中的异常可以分为两大类:受检查的异常(Checked Exceptions)和未受检查的异常(Unchecked Exceptions)。

1. 受检查的异常(Checked Exceptions):这些异常在编译时会被检查,必须显式地处理它们。例如,IOException、ClassNotFoundException等。
如果一个方法可能会抛出受检查的异常,那么该方法要么必须通过try-catch块来捕获并处理该异常,要么必须在方法签名中使用throws关键字来声明该异常。

2. 未受检查的异常(Unchecked Exceptions):这些异常在编译时不会进行检查,它们通常表示程序中的逻辑错误或运行时错误。例如,NullPointerException、ArrayIndexOutOfBoundsException等。如果一个方法可能会抛出未受检查的异常,那么该方法不需要在方法签名中使用throws关键字来声明该异常。

除了try-catch块外,Java还提供了其他几种异常处理机制,包括:

 throws关键字:用于声明一个方法可能会抛出哪些受检查的异常。
 finally块:无论try块中是否发生异常,finally块中的代码都会执行。通常用于资源的清理操作,如关闭文件、数据库连接等。
 throw关键字:用于在方法内部手动抛出异常。当程序中发生异常时,可以使用throw关键字抛出异常,然后将其传递给调用该方法的代码进行处理。
 Java标准库中提供的多种异常类:Java标准库中提供了许多预定义的异常类,如IOException、SQLException等。这些异常类可以用于表示各种不同的错误情况,并且可以自定义新的异常类来表示应用程序特有的错误情况。

2.异常处理
在Java中,我们使用try-catch-finally语句块来处理异常。
try块包含可能会引发异常的代码,catch块用于捕获并处理特定的异常,而finally块包含的代码无论是否发生异常都会执行。

下面是一个简单的例子:

结论:在这个例子中,我们有一个方法divide,如果除数为0,它会抛出一个ArithmeticException。在main方法中,我们调用divide方法,并使用try-catch-finally语句块来处理可能发生的异常。

1.如果除数不为0,那么程序会正常执行,并打印出结果。
2.如果除数为0,那么会触发ArithmeticException,程序会跳到catch块,打印出"Cannot divide by zero!"。
3.无论是否发生异常,finally块中的代码都会执行,打印出"This code is executed in every case."。
注意:如果可能抛出多个异常类型,你可以添加多个catch块来处理不同的异常。例如:

3.异常抛出与自定义异常
在Java中,当一个方法遇到错误条件时,它会抛出一个异常。这是通过使用throw关键字完成的。

自定义异常,你也可以创建自定义的异常类,这通常是通过继承Exception类或其子类来完成的。下面是一个自定义异常的例子:在这个例子中,我们创建了一个新的MyException类,它继承了Exception类。然后我们在try-catch块中抛出并捕获这个自定义异常。

4. 异常链
在Java中,异常链(Exception chaining)是一种机制,通过它可以将一个异常与导致它的异常(或多个异常)关联起来。

作用:提高了代码的可维护性和可读性。详细如下几点

1.提供更多的上下文信息:通过将多个异常关联在一起,可以提供关于异常发生时的更多上下文信息。这有助于更准确地诊断和解决问题。
2.追踪异常来源:通过使用异常链,可以在处理异常时更方便地追踪异常的来源。这有助于确定问题的根本原因,以及如何采取适当的措施来避免或解决该问题。
3.简化异常处理:异常链使开发人员能够将多个异常处理逻辑集中在一个地方,而不是为每个异常单独编写处理代码。这有助于简化异常处理逻辑,并提高代码的可维护性。
4.提供更详细的错误报告:通过将多个异常关联在一起,可以提供更详细的错误报告。这有助于开发人员更好地理解问题的性质和范围,从而能够更快地解决问题。

实现:

异常链可以通过Throwable类的initCause(Throwable cause)方法实现。该方法允许在创建新的异常时,将一个已存在的异常作为原因(cause)与它关联起来。
这样,在捕获并处理异常时,我们可以使用Throwable类的getCause()方法获取导致当前异常的原始异常。

在上面的代码中,我们首先抛出一个新的Exception对象,然后在捕获该异常时,我们创建一个新的Exception对象,并将原始的异常对象作为第二个参数传递给构造函数。这样,第二个异常就包含了导致它的原始异常。然后我们重新抛出这个新的异常。


当调用getCause()方法时,我们可以获取导致第二个异常的原始异常。

例如在上面的代码中,我们捕获了第二个异常,并使用getCause()方法获取导致该异常的原始异常。然后我们打印出原始异常的消息。输出结果为:“Caused by: First exception”。

二、字符串-String

定义
在Java中,字符串是一种不可变的对象,用于表示文本数据。字符串是由零个或多个字符组成的序列。Java中的字符串通常用双引号括起来,表示该字符串是一个字符串字面值。

不变性

Java中的字符串具有不变性,是因为它们在结构上是不可变的。字符串字面值被编译成字符数组,而这个字符数组被存储在只读内存中。 通过将字符串实现为字符数组,Java可以在内存中高效地操作字符串。

由于字符串是不可变的,当对字符串执行操作时,实际上是创建了一个新的字符串,而不是修改原始字符串。例如,当我们对字符串进行连接、切割或替换操作时,Java会创建新的字符串来保存操作的结果。 这种实现方式可以避免因为修改字符串而产生不必要的性能开销。

总的来说,Java中的字符串之所以具有不变性,是因为其底层结构是基于字符数组实现的,并且操作字符串时是通过创建新的字符串来实现的。 这种设计可以提高内存使用效率,并增强字符串的安全性。

常用方法
Java中的字符串类String提供了许多常用的方法,以下是一些常用的方法:

*charAt(int index): 返回指定索引位置的字符。
*length(): 返回字符串的长度。
*substring(int beginIndex, int endIndex): 返回从beginIndex到endIndex之间的子字符串。
*indexOf(String substring): 返回子字符串第一次出现的索引,如果未找到则返回-1。
*lastIndexOf(String substring): 返回子字符串最后一次出现的索引,如果未找到则返回-1。
*equalsIgnoreCase(String anotherString): 比较两个字符串的内容是否相同,不区分大小写。
*startsWith(String prefix): 测试字符串是否以指定的前缀开始。
*endsWith(String suffix): 测试字符串是否以指定的后缀结束。
*replace(char oldChar, char newChar): 替换字符串中的所有指定字符为另一个字符。
*replaceAll(String regex, String replacement): 使用正则表达式替换字符串中的所有匹配项。
*toLowerCase(): 将字符串转换为小写。
*toUpperCase(): 将字符串转换为大写。
*trim(): 去除字符串两侧的空白字符和其他预定义的可忽略字符。
除了上述方法,String类还提供了许多其他方法,用于处理字符串的各种操作。另外,如果需要更高效的字符串操作,可以使用StringBuilder或StringBuffer类。

StringBuilder类
创建成功的字符串对象,长度是固定的,内容不能被改变与编译。虽然使用 + 运算符能够达到附加新字符或新字符串的目的,但是 + 运算符是产生一个新的String实例,创建一个新的字符串对象,如果大量的对字符串进行修改,会极大的增加系统开销。

例如:

StringBuilder类不是字符串,所以要创建StringBuilder类的对象,需要调用其构造方法。
可以传递以下参数进行构造。

1.StringBuilder sb=new StringBuilder("123");
1.如果需要将StringBuilder类值,转换为Stirng类值呢?StringBuilder提供了toString方法,会将StringBuilder对象内的值转换为字符串进行返回。


所以我们可以将需要对字符串进行大量修改的操作转移到StringBuilder内进操作,操作完毕后再将其转换为字符串。这样就节省了大量的内存空间,提高了运行效率。

三、常用类库
在Java中,基本类型的包装类是对应于基本数据类型的类。它们可以将基本类型转换为对象,以便在需要对象参数的场合使用。这些包装类包括:Integer、Double、Boolean等等。

1. 基本类型的包装类:

基本类型的包装类是将基本类型封装成对象,以便在需要对象参数的场合使用。
每个基本类型都有一个对应的包装类,例如Integer、Double、Boolean等。
包装类的主要作用是提供了一些方法来操作基本类型,例如将基本类型转换为字符串、进行算术运算等。
2. Date类:

基本类型的包装类是将基本类型封装成对象,以便在需要对象参数的场合使用。
每个基本类型都有一个对应的包装类,例如Integer、Double、Boolean等。
包装类的主要作用是提供了一些方法来操作基本类型,例如将基本类型转换为字符串、进行算术运算等。
3. SimpleDateFormat类:

SimpleDateFormat类是一个日期时间格式化类,它可以将日期时间对象转换为字符串,也可以将字符串解析为日期时间对象。
你可以使用SimpleDateFormat类的构造方法创建一个格式化对象,并指定日期时间的格式。
SimpleDateFormat类提供了一些方法来格式化日期时间,例如format()方法将日期时间对象格式化为字符串。
另外,SimpleDateFormat类还提供了一些方法来解析字符串为日期时间对象,例如parse()方法将字符串解析为Date对象。
4. Calendar类:

Calendar类是Java的日期时间辅助类,它提供了一种方便的方式来处理日期和时间。
Calendar类提供了一些静态常量来表示日期和时间的各个部分,例如ERA、YEAR、MONTH、DAY_OF_MONTH等。
你可以使用Calendar类的构造方法创建一个Calendar对象,并使用set()方法设置日期和时间的各个部分。
Calendar类还提供了一些方法来获取当前日期和时间的各个部分,例如get()方法获取指定字段的值。
5. Math类:

Math类是Java的数学辅助类,它提供了一些静态方法来执行常见的数学运算,例如sqrt()方法计算平方根、log()方法计算自然对数等。
Math类还包含一些常量和常用函数的值,例如PI表示π的值、E表示自然对数的底数等。
你可以使用Math类的静态方法来执行数学运算,例如Math.sqrt(x)计算x的平方根。

总结:

通过学习这些常用类,你将能够更深入地理解Java中的基本数据类型,并能够进行基本类型和包装类之间的转换。你还可以掌握这些常用类的使用方法,以便在实际编程中更好地处理日期、时间和数学计算等问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是第十版Java教材第九章复习题的答案: 1. 什么是接口?如何声明一个接口? 接口是一种抽象数据类型,它定义了一组方法,但没有提供方法的实现。它只是指定了方法名、参数列表和返回类型。可以通过实现接口来提供方法的具体实现。 接口声明使用interface关键字,如下所示: ``` public interface MyInterface { public void method1(); public int method2(String str); } ``` 2. 什么是抽象类?如何声明一个抽象类? 抽象类是一个不能被实例化的类,它只能被继承。抽象类可以包含抽象方法和非抽象方法。抽象方法没有具体的实现,而是由子类提供实现。 抽象类声明使用abstract关键字,如下所示: ``` public abstract class MyAbstractClass { public abstract void method1(); public void method2() { // implementation } } ``` 3. 接口和抽象类有什么区别? 接口只能包含抽象方法和常量,而抽象类可以包含非抽象方法和属性。另外,类只能继承一个类,但可以实现多个接口。 4. 什么是函数式接口?如何声明一个函数式接口? 函数式接口是只包含一个抽象方法的接口。它们通常用于Lambda表达式和方法引用。 函数式接口声明使用@FunctionalInterface注解,如下所示: ``` @FunctionalInterface public interface MyFunctionalInterface { public void method(); } ``` 5. Lambda表达式是什么?如何使用Lambda表达式? Lambda表达式是一种匿名函数,它可以作为参数传递给方法或赋值给变量。它的语法如下: ``` (parameter1, parameter2, ...) -> expression ``` 例如: ``` Arrays.sort(names, (String s1, String s2) -> s1.compareTo(s2)); ``` 这个Lambda表达式定义了一个比较字符串的方法,并传递给Arrays.sort方法。 6. 方法引用是什么?如何使用方法引用? 方法引用是一种简化Lambda表达式的方式,它允许你引用已经存在的方法并将其作为Lambda表达式传递给方法或赋值给变量。它的语法如下: ``` ClassName::methodName ``` 例如: ``` Arrays.sort(names, String::compareTo); ``` 这个方法引用引用了String类的compareTo方法,并传递给Arrays.sort方法。 7. Stream是什么?如何使用Stream? Stream是一种在集合上进行复杂操作的方式。它提供了过滤、映射、排序等操作。Stream的操作可以是中间操作或终端操作。中间操作返回一个Stream对象,终端操作返回一个非Stream对象(如List、Map等)。 例如: ``` List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); ``` 这个代码使用Stream过滤以"A"开头的字符串,并将结果存储在List中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值