前言
今天看看Java编程时出现的部分异常,怎么解决。
一、异常是什么?
异常:异常是一种程序运行时的错误,但是不是BUG,bug是由于语法错误或者是单词错误造成的,bug是可以通过修改代码来矫正错误使程序通过编译。而异常是我们知道某个地方会出错,但是我们没有办法改正的错误,我们称为异常,简单举例说明:大家都用过QQ 微信 对吧,当你在使用这个软件的过程中,突然断网,这时就我们影响了我们的使用,这时就会报出网络异常的提示,像这种情况我们称为异常,就相当于因为计算机中不可抗力的因素而导致的错误。
今天我们先简单的介绍几个小白朋友们在编码过程中常见的几个异常。
1.空指针异常
NullPointerException
上面的这个异常提示相信大家都见过 这就是空指针异常,空指针异常的意思是:在对象为空,但是引用这个对象的方法,一般体现在变量为空或者为null时,然后再引用这个对象,就会报出空指针异常的错误。
面对空指针异常,我们有两个解决办法,第一个就是抛出去,让别人解决(俗称:甩锅),但是作为一个正直的程序猿,这种事我们不会去做,我们一般会用到sty catch去解决,可能第一次听到这两个单词的小伙伴不知道啥意思,你可以理解为 为本方案制定一个B计划,原计划不行咱就走B计划。
具体代码体现:
public static void main(String[] args) {
System.out.println("程序开始了...");
/*
try{}语句块不能单独写,后面要么跟catch语句块要么跟finally语句块
异常处理机制关注的是:明知道程序可能出现某种错误,但是该错误无法通过修改逻辑
完全规避掉时,我们会使用异常处理机制,在出现该错误是提供一种补救办法。
凡是能通过逻辑避免的错误都属于bug!就应当通过逻辑去避免!
*/
try {
// String str = null;
// String str = "";
String str = "a";
/*
若str=null的情况
当JVM执行到下面代码时:str.length()会出现空指针,此时虚拟机就会根据该情况
实例化一个对应的异常实例出来,即:空指针异常实例 NullPointerException实例
然后将程序从一开始执行到报错这句话的过程设置到该异常实例中,此时该异常通过
类型名字可以表达出现了什么错误,并将来可以通过输出错误信息来得知错误出现在那里
虚拟机会将该异常抛出
当某句代码抛出了一个异常时,JVM会做如下操作:
1:检查报错这句话是否有被异常处理机制控制(有没有try-catch)
如果有,则执行对应的catch操作,如果没有catch可以捕获该异常则视为没有
异常处理动作
2:如果没有异常处理,则异常会被抛出当当前代码所在的方法之外由调用当前方法的
代码片段处理该异常
*/
System.out.println(str.length());//抛出空指针异常
System.out.println(str.charAt(0));
System.out.println(Integer.parseInt(str));
/*
当try中某句代码报错后,就会跳出try执行下面对应的catch块,执行后就会
退出catch继续向后执行。因此try语句块中报错代码以下的内容都不会被执行
*/
System.out.println("!!!!!!!!!!!!!!");
// }catch(NullPointerException e){
// //这里实际开发中是写补救措施的,通常也会将异常信息输出便于debug
// System.out.println("出现了空指针,并解决了!");
// }catch(StringIndexOutOfBoundsException e){
// System.out.println("处理字符串下标越界问题!");
// }
/*
当try语句块中可能出现的几种不同异常对应的处理办法相同时,可以采取合并
catch的做法,用同一个catch来捕获这几种可能出现的异常,而执行措施使用
同一个。
*/
}catch(NullPointerException|StringIndexOutOfBoundsException e){
System.out.println("处理空指针或下标越界!");
/*
当catch捕获某个超类型异常时,那么try语句块中出现它类型异常时都可以被这个
catch块捕获并处理。
如果多个catch捕获的异常之间存在继承关系时,一定是子类异常在上超类异常在下
*/
}catch(Exception e){
System.out.println("反正就是出了个错!");
}
System.out.println("程序结束了...");
}
出现异常可以参考快捷键:AIT+回车