语法错误是你真写错了,比如“All the people here work hardly.”这句话就是语法错误,hard也可用作副词,所以“All the people here work hard.”这样就好了。比如你一个Python程序员来写Java代码,上来就是一个a=100,Python没问题,Java就不行了,你这a的类型都没有?报错。
运行时异常是你只要使用姿势正确,那么它就应该正常工作,使用姿势不正确,那就抛出来的异常,比如下面这个方法
如果你给的参数确实可以转成数字,那程序正常运行,但是如果你给的参数不能转成数字,他就不能正常运行,这个时候他抛出运行时异常NumberFormatException。只要你能保证你给他的数据都能正确的转成数字,那就!!一定不会!!抛出NumberFormatException。
至于怎么保证,那是调用方的事情是吧,假如你是写这个parseInt方法的人,你不用管调用你代码的人这么保证对吧,你也管不着。
受检异常则是强制性的必须要求调用方在出错的时候做点事情。这和运行时异常有一点区别的地方就是像刚才提到的parseInt方法,只要调用方参数ok,那我就一定不会抛出NumberFormatException,调用方也就一定不会得到这个异常,所以他也不用处理(注意我说的前提是他每次给的数据都ok)。但是受检异常是,就算你每次调用都给了正确的数据,他也有可能会出错,不怕一万就怕万一是吧,运气背出现了一也要处理才对。
简单的说区别就是运行时异常,只要参数ok,那就一定不出现异常,这个时候调用方也就没有必要catch一下异常或者怎么样(你都保证一定不出现异常了,你还要写处理这个异常的代码?没必要对吧)。但是受检异常是就算参数都ok,他也可能出问题,所以他要求你一定要写代码处理受检异常,你把它catch住算是处理了,你把它throws声明说我处理不了,调用我的人自己看着办也算是一种处理方式对吧。
举一个受检异常的例子
URL url = new URL("https://www.google.com");
URLConnection conn = url.openConnection();
try {
conn.connect();
} catch (IOException e) {
e.printStackTrace();
}
你说这参数写的有问题吗,没有对吧,那这代表这个connect方法一定不出错?不代表。你访问不了google,你这参数写的再对你也访问不了,你不管怎么改进你这点代码,不行就是不行。由于你这个网络的问题对吧,你不可能做到你一定可以connect成功,所以写这个connect方法的人觉得你一定要处理连不上怎么办,所以他给了你一个受检的IOException。
总结一下
1.语法错误就是你不会写代码,瞎写。
2.运行时异常就是,写那个parseInt方法的人觉得,只要你给我的参数都对,我就一定可以正常工作,只有参数不对的时候,我才抛出一个运行时异常NumberFormatException。这样的话只要你保证你每次调用时都能给正确的参数,你就永远不需要处理NumberFormatException。
3.受检异常就是写那个connect方法的人觉得,就算是你做了最大的努力改进你的代码,就算是你的代码已经完美的不行,你用我的connect方法,我也可能会报错,所以我给你一个受检异常IOException,你的代码一定要处理才行。