网站源码上传图片出错,银行外包不是人干的,做网页找什么公司,网站建设在哪能看大家好#xff0c;欢迎来到乐字节小乐的Java技术分享园地在计算机程序运行的过程中#xff0c;总是会出现各种各样的错误。有一些错误是用户造成的#xff0c;比如#xff0c;希望用户输入一个int类型的年龄#xff0c;但是用户的输入是abc#xff1a;// 假设用户输入了a…大家好欢迎来到乐字节小乐的Java技术分享园地在计算机程序运行的过程中总是会出现各种各样的错误。有一些错误是用户造成的比如希望用户输入一个int类型的年龄但是用户的输入是abc// 假设用户输入了abcString s abc;int n Integer.parseInt(s); // NumberFormatException!程序想要读写某个文件的内容但是用户已经把它删除了// 用户删除了该文件String t readFile(C:\\abc.txt); // FileNotFoundException!还有一些错误是随机出现并且永远不可能避免的。比如网络突然断了连接不到远程服务器内存耗尽程序崩溃了用户点“打印”但根本没有打印机……所以一个健壮的程序必须处理各种各样的错误。所谓错误就是程序调用某个函数的时候如果失败了就表示出错。调用方如何获知调用失败的信息有两种方法方法一约定返回错误码。例如处理一个文件如果返回0表示成功返回其他整数表示约定的错误码int code processFile(C:\\test.txt);if (code 0) {// ok:} else {// error: switch (code) {case 1:// file not found: case 2:// no read permission: default:// unknown error: }}因为使用int类型的错误码想要处理就非常麻烦。这种方式常见于底层C函数。方法二在语言层面上提供一个异常处理机制。Java内置了一套异常处理机制总是使用异常来表示错误。异常是一种class因此它本身带有类型信息。异常可以在任何地方抛出但只需要在上层捕获这样就和方法调用分离了try {String s processFile(“C:\\test.txt”);// ok:} catch (FileNotFoundException e) {// file not found:} catch (SecurityException e) {// no read permission:} catch (IOException e) {// io error:} catch (Exception e) {// other error:}因为Java的异常是class它的继承关系如下┌───────────┐│ Object │└───────────┘▲│┌───────────┐│ Throwable │└───────────┘▲┌─────────┴─────────┐│ │┌───────────┐ ┌───────────┐│ Error │ │ Exception │└───────────┘ └───────────┘▲ ▲┌───────┘ ┌────┴──────────┐│ │ │┌─────────────────┐ ┌─────────────────┐┌───────────┐│OutOfMemoryError │... │RuntimeException ││IOException│...└─────────────────┘ └─────────────────┘└───────────┘▲┌───────────┴─────────────┐│ │┌─────────────────────┐ ┌─────────────────────────┐│NullPointerException │ │IllegalArgumentException │...└─────────────────────┘ └─────────────────────────┘从继承关系可知Throwable是异常体系的根它继承自Object。Throwable有两个体系Error和ExceptionError表示严重的错误程序对此一般无能为力例如OutOfMemoryError内存耗尽NoClassDefFoundError无法加载某个ClassStackOverflowError栈溢出而Exception则是运行时的错误它可以被捕获并处理。某些异常是应用程序逻辑处理的一部分应该捕获并处理。例如NumberFormatException数值类型的格式错误FileNotFoundException未找到文件SocketException读取网络失败还有一些异常是程序逻辑编写不对造成的应该修复程序本身。例如NullPointerException对某个null的对象调用方法或字段IndexOutOfBoundsException数组索引越界Exception又分为两大类RuntimeException以及它的子类非RuntimeException(包括IOException、ReflectiveOperationException等等)Java规定必须捕获的异常包括Exception及其子类但不包括RuntimeException及其子类这种类型的异常称为Checked Exception。不需要捕获的异常包括Error及其子类RuntimeException及其子类。捕获异常捕获异常使用try...catch语句把可能发生异常的代码放到try {...}中然后使用catch捕获对应的Exception及其子类// try...catchimport java.io.UnsupportedEncodingException;import java.util.Arrays;Run如果我们不捕获UnsupportedEncodingException会出现编译失败的问题// try...catchimport java.io.UnsupportedEncodingException;import java.util.Arrays;Run编译器会报错错误信息类似unreported exception UnsupportedEncodingException; must be caught or declared to be thrown并且准确地指出需要捕获的语句是return s.getBytes(GBK);。意思是说像UnsupportedEncodingException这样的Checked Exception必须被捕获。这是因为String.getBytes(String)方法定义是public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {...}在方法定义的时候使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候必须强制捕获这些异常否则编译器会报错。在toGBK()方法中因为调用了String.getBytes(String)方法就必须捕获UnsupportedEncodingException。我们也可以不捕获它而是在方法定义处用throws表示toGBK()方法可能会抛出UnsupportedEncodingException就可以让toGBK()方法通过编译器检查// try...catchimport java.io.UnsupportedEncodingException;import java.util.Arrays;Run上述代码仍然会得到编译错误但这一次编译器提示的不是调用return s.getBytes(GBK);的问题而是byte[] bs toGBK(中文);。因为在main()方法中调用toGBK()没有捕获它声明的可能抛出的UnsupportedEncodingException。修复方法是在main()方法中捕获异常并处理// try...catchimport java.io.UnsupportedEncodingException;import java.util.Arrays;Run可见只要是方法声明的Checked Exception不在调用层捕获也必须在更高的调用层捕获。所有未捕获的异常最终也必须在main()方法中捕获不会出现漏写try的情况。这是由编译器保证的。main()方法也是最后捕获Exception的机会。如果是测试代码上面的写法就略显麻烦。如果不想写任何try代码可以直接把main()方法定义为throws Exception// try...catchimport java.io.UnsupportedEncodingException;import java.util.Arrays;Run因为main()方法声明了可能抛出Exception也就声明了可能抛出所有的Exception因此在内部就无需捕获了。代价就是一旦发生异常程序会立刻退出。还有一些童鞋喜欢在toGBK()内部“消化”异常static byte[] toGBK(String s) {try {return s.getBytes(GBK);} catch (UnsupportedEncodingException e) {// 什么也不干 }return null;这种捕获后不处理的方式是非常不好的即使真的什么也做不了也要先把异常记录下来static byte[] toGBK(String s) {try {return s.getBytes(GBK);} catch (UnsupportedEncodingException e) {// 先记下来再说: e.printStackTrace();}return null;所有异常都可以调用printStackTrace()方法打印异常栈这是一个简单有用的快速打印异常的方法。小结Java使用异常来表示错误并通过try ... catch捕获异常Java的异常是class并且从Throwable继承Error是无需捕获的严重错误Exception是应该捕获的可处理的错误RuntimeException无需强制捕获非RuntimeException(Checked Exception)需强制捕获或者用throws声明不推荐捕获了异常但不进行任何处理。关注乐字节这里有更多更好的Java干货知识