😎本章概览:
一、上节遗珠(StringBuilder and StringBuffer)
1、应用场景与作用
📣📣上节“抽丝剥茧“String细节点我们提到,用String进行连续拼接会产生大量的临时变量,对内存占用很大,而且这样的代码风格也不好,那么有没有一种类型既能进行连续拼接又不会产生大量的临时变量呢?StringBuilder 和 StringBuffer 应运而生,这两个类型作用其实相差无几,但在线程安全方面有一些区别,这个我们下文详细再说💖💖
用String进行一次拼接就产生了很多的临时变量
用StringBuffer进行拼接
pubic static void main(String[] args) {
String str="hello";
str=str+"world";//不建议这么写,因为会产生很多临时变量
char [] arr={'a','d','f','g'};
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("hello").append("world").append("ren");
stringBuffer.append(12).append(arr);
System.out.println(stringBuffer);
//结果:helloworldren12adfg->StringBuffer可以任意拼接而不产生临时变量;
}
2、Stringbuilder 、StringBuffer、String之间的区别
(1)典型回答
🥳🥳String 是 Java 语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
🥳🥳StringBuffer 是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就是 StringBuilder。
StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。
(2)简明说法:
对于String与Stringbuilder 、StringBuffer区别
(1)String 字符串拼接会产生大量的临时变量,而Stringbuilder 、StringBuffer不会
(2)String拼接会被优化为Stringbuilder 的拼接。
对于Stringbuilder 、StringBuffer区别
二、异常初识
1、java异常的体系
Throwable这个java类被用来表示任何可以作为异常被抛出的类。Throwable可以分为两类,Error用来表示编译时和系统错误;Exception是可以被抛出的基本类型,在java类库中,用户方法以及运行时故障,中都可能抛出异常。
Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。
不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
2、Error和Exception的区别
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
3.常见的异常
//常见的异常
//Exception in thread "main" java.lang.ArithmeticException: / by zero
public static void main1(String[] args) {
// int a=10/0;
// System.out.println(a);
//Exception in thread "main" java.lang.NullPointerException
//int [] arr={1,2,3,4,5};
//arr=null;
// System.out.println(arr[0]);
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
//int [] arr={1,2,3,4,5};
//System.out.println(arr[100]);
}
}
3、捕获异常细节剖析
1.需要注意的是异常被捕获之后,程序还可以按照原路径进行执行。如果异常不被捕获,则程序在原路径下会被中止执行
比如面这段代码在没有捕获异常之前:
public static void main(String[] args) {
int t=0 ;
int c=12;
int a=10/t;
System.out.println(c);
}
结果:在21行就中止了.并没有打印c
捕获异常之后:
public static void main(String[] args) {
int t=0 ;
int c=12;
try {
int a=10/t;
System,out.println("这里不会被执行");
}catch (ArithmeticException e)
{
e.printStackTrace();
System.out.println("可能有算数异常");
}
System.out.println(c);
}
c被成功打印:
2.捕获异常与不捕获异常的内部区别(进一步理解)
异常在没有被捕获的情况下,异常会自动交给JVM处理,这样会导致程序立即停止。但如果异常被捕获了,那异常将交由程序自己处理,程序沿原有路径还可以继续进行
4、finally块的特点
finally在异常捕获机制中是必然会被执行的一个代码块。因此他经常用于首位工作,比如关闭资源(etc:文件的关闭)。
这里返回的是2,因为finally块中肯定会被执行
5、手动抛出异常
(1)基本形式
public static void main(String[] args) {
int t =0;
if(t==0){
throw new UnsupportedOperationException("t==0");
}
}
(2)抛出异常后程序的运行机制
《Thinking in Java》异常抛出后,有几件事会随之发生:
🗽🗽1.同java其他对象的创建一样,将使用new在堆上创建异常对象
🥳🥳2.当前执行路径被终止,并且从当前环境中弹出对当前对象的引用。
3.异常处理机制接管程序,并寻找一个恰当的地方来继续执行程序。这个恰当的地方,就是“异常处理程序”,它的任务是将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续运行下去(注意:这里说的运行是异常这种错误被抛出到一种更大的环境种以一种正确的形式运行)
6、自定义异常
class MyException extends Exception{
public MyException()
{
super();
}
public MyException(String s)
{
super(s);
}
}
public class JavaDemo {
//自定义异常如果继承自Exception,则必须在方法后后声明有异常,继承RuntimeException,则不需要
//建议继承Exception (因为必须声明,便于程序的阅读以及注意到异常)
public static void main(String[] args) throws MyException{
int x=0;
if (x==0)
{
throw new MyException("x==0");
}
}
NullPointerException异常源码
7、try,catch异常捕获注意事项汇总
1.catch块中,一定要捕获相应的异常,如果程序抛出的异常在catch块当中不能
被捕获,那么就会交由JvM处理(中止原有路径的程序执行)。
2.可以通过catch捕获多个异常。
3.不建议大家直接捕获Exception。(并不清楚具体的异常类型是什么)
4.finally代码块中,终究会被执行的。
5.不建议在fianlly块中出现return 语句(很容易造成理解错误,而且代码的健壮性会很差。)
三、写在最后
在前面的文章里,我们对java语法已经有了一定的掌握,但还需要做一些题来进行巩固,对此分享一下最近发现的牛客网的一个宝藏题单,主要面向基础语法,适合对java语法的巩固夯实,大家一起来试试吧!✔✔java基础语法题单✔✔