异常是什么
异常就是有异于常态,和正常情况不一样,有错误出现。
异常分类
Error:
是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。
代表异常:VirtualMachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)、OutOfMemoryError。
此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。
Exception:
程序本身可以捕获并且可以处理的异常。又分为不受检异常、受检异常
- 运行时异常(不受检异常):
RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常。
代表异常:NullPointerException)、ArrayIndexOutBoundException。
此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
- 非运行时异常(受检异常):
Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常
代表异常:说IOException
必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
异常的处理
抛出异常:throw,throws
throw
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行。
public class DemoThrow {
public static void main(String[] args) {
int a = DemoThrow.div(4,0);
System.out.println(a);
}
public static int div(int a,int b)
{
if(b==0)
throw new ArithmeticException("异常信息:除数不能为0");//抛出具体问题,编译时不检测
return a/b;
}
}
throws
运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class DemoThrows {
public static void main(String[] args) throws FileNotFoundException{
readFile();
}
public static void readFile() throws FileNotFoundException {
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
}
}
try代码块
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class DemoTryCatch {
public static void main(String[] args) {
//捕获异常
try {
//可能产生异常的代码
readFile();
} catch (FileNotFoundException e) {
//异常的处理逻辑,将异常记录日志,异常封装后显示
System.out.println("系统找不到指定的路径");
}
System.out.println("后续代码");
}
public static void readFile() throws FileNotFoundException {
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
}
}
kotlin异常处理
Kotlin 中所有异常类都是 Throwable 类的子类。
throw
fun main() {
//sampleStart
throw Exception("Hi There!")
//sampleEnd
}
try
try {
// 一些代码
}
catch (e: SomeException) {
// 处理程序
}
finally {
// 可选的 finally 块
}
try表达式
fun e3(){
val result = try {
throw IllegalArgumentException("exception happen")
}catch (e:Throwable){
println(e.message)
0 //返回最后一行
}finally {
123 //不会作为返回值,只会返回try、catch最后一行
}
println(result)
}
try-表达式的返回值是 try 块中的最后一个表达式或者是(所有)catch 块中的最后一个表达式。 finally 块中的内容不会影响表达式的结果。
受检的异常
Kotlin 没有受检的异常。可以理解都是运行时异常。同理AS不会提醒你要捕捉异常。
Java
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
kotlin
Thread.sleep(3000)
经过了解知道,不仅仅Thread.sleep不需要获取异常,像对文件操作一般需要捕获的IOException也不需要了;
原来kotlin在编译时根本不会检查你有没有捕获异常!
看到这里我也是有点担心的,不捕获异常万一在运行时抛出异常程序不就崩了吗?
其实很多异常我们是可以预估到它可能会发生并且避免的,比如Thread.sleep的InterruptedException,只有在调用thrad.interrupt()方法后才会抛出,正常情况下并不会抛出该异常,但是在java中编译器却强制我们要捕获,让代码看起来就很臃肿不够简洁;
而且 java强制要求捕获异常并没有降低异常的发生,有很多更常见的异常并没有强制要求捕获,例如:NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException等
kotlin并不是告诉你不要再捕捉异常!对待异常,我们还是要养成良好的编码习惯,考虑周全一些,在可能抛出异常的地方通过if判断等方式将其扼杀在摇篮里;