Java异常是一种特殊的程序错误,它可以在运行时发生,并且可以被捕获和处理。它们是由Java虚拟机(JVM)抛出的,并且可以通过使用try-catch块来处理。
Java异常的使用场景包括:
1. 当程序尝试执行不允许的操作时,例如尝试访问不存在的文件或数组中不存在的元素时。 2. 当程序尝试执行一些无效的操作时,例如尝试将字符串转换为数字时。 3. 当程序尝试执行一些不安全的操作时,例如尝试分配内存大于可用内存量时。 4. 当系统出现意外情况或错误时,例如当文件损坏或未能正常加载时。 5. 在多线程应用中,当一个线程尝试对另一个正在运行中的对象进行修改或删除时。 6. 在数据库应用中,当SQL命令出错或者数据库未能正常连接时。
以下代码显示了如何获取线程的堆栈帧。
Throwable对象在创建线程的点处捕获线程的堆栈。
public class Main { public static void main(String[] args) { m1(); } public static void m1() { m2(); } public static void m2() { m3(); } public static void m3() { Throwable t = new Throwable(); StackTraceElement[] frames = t.getStackTrace(); printStackDetails(frames); } public static void printStackDetails(StackTraceElement[] frames) { System.out.println("Frame count: " + frames.length); for (int i = 0; i < frames.length; i++) { int frameIndex = i; // i = 0 means top frame System.out.println("Frame Index: " + frameIndex); System.out.println("File Name: " + frames[i].getFileName()); System.out.println("Class Name: " + frames[i].getClassName()); System.out.println("Method Name: " + frames[i].getMethodName()); System.out.println("Line Number: " + frames[i].getLineNumber()); } } }
上面的代码生成以下结果。
Java 7添加了一个名为try-with-resources的新结构。
使用Java 7中的新的try-with-resources构造,上面的代码可以写成
try (AnyResource aRes = create the resource...) { // Work with the resource here. // The resource will be closed automatically. }
当程序退出构造时,try-with-resources构造自动关闭资源。
资源尝试构造可以具有一个或多个catch块和/或finally块。
我们可以在try-with-resources块中指定多个资源。两个资源必须用分号分隔。
最后一个资源不能后跟分号。
以下代码显示了try-with-resources使用一个和多个资源的一些用法:
try (AnyResource aRes1 = getResource1()) { // Use aRes1 here } try (AnyResource aRes1 = getResource1(); AnyResource aRes2 = getResource2()) { // Use aRes1 and aRes2 here }
我们在try-with-resources中指定的资源是隐式最终的。
在try-with-resources中的资源必须是java.lang.AutoCloseable类型。
Java 7添加了AutoCloseable接口,它有一个close()方法。
当程序退出try-with-resources块时,将自动调用所有资源的close()方法。
在多个资源的情况下,按照指定资源的相反顺序调用close()方法。
class MyResource implements AutoCloseable { public MyResource() { System.out.println("Creating MyResource."); } @Override public void close() { System.out.println("Closing MyResource..."); } } public class Main { public static void main(String[] args) { try (MyResource mr = new MyResource(); MyResource mr2 = new MyResource()) { } } }
上面的代码生成以下结果。
Java 7增加了对多catch块的支持,以便在catch块中处理多种类型的异常。
我们可以在multi-catch块中指定多个异常类型。多个异常由竖线(|)分隔。
捕获三个异常:Exception1,Exception2和Exception3。
try { // May throw Exception1, Exception2, or Exception3 } catch (Exception1 | Exception2 | Exception3 e) { // Handle Exception1, Exception2, and Exception3 }
在multi-catch块中,不允许有通过子类化相关的替代异常。
例如,不允许以下multi-catch块,因为Exception1和Exception2是Throwable的子类:
try { // May throw Exception1, Exception2, or Exception3 } catch (Exception1 | Exception2 | Throwable e) { // Handle Exceptions here }
Java面向对象设计 -Java异常处理异常是在没有定义正常执行路径时在Java程序的执行期间可能出现的条件。Java通过将执行操作的代码...
Java数据类型教程 -Java字符数据类型Character类的一个对象包装一个char值。字符类包含isLetter()和isDigit()方法来检查字符是否...
Java数据类型教程-Java无符号数据类型Java不支持无符号数据类型。byte,short,int和long都是有符号数据类型。对于有符号数据类...
Java数据类型教程 - Java字符串字符索引字符您可以使用charAt()方法从String对象中获取特定索引处的字符。索引从零开始。下面的...
Java数据类型教程 - Java字符串Swtichswitch-expression使用String类型。如果switch-expression为null,则抛出NullPointerExcept...