Java小白踩坑录 - 难以琢磨的try-catch

简介: Java小白踩坑录 - 难以琢磨的try-catch

image.png

try-catch 之一矮矬穷泡妞

Java 程序猿也会碰到难以琢磨的 try-catch,请看下面的例子:

public static void main(String[] args) {
  try {
    System.out.println("Hello world");
  } catch(IOException e) {
    System.out.println("抓到一个 IO 异常!");
  }
 }

这段代码可以打印出什么?

可能不少人会说,这个不是很简单嘛?打印出:

Hello world

其实它压根编译都不能通过!

image.png

报错情况

Unreachable catch block for IOException. This exception is never thrown from the try statement body

为什么呢?简单的说,就是 try 里没有能抛出 IOException 异常的语句,catch 该异常就通不过编译。

JSL-11.2.3 里规定了:

It is a compile-time error if a method or constructor body can throw some exception class E when E is a checked exception class and E is not a subclass of some class declared in the throws clause of the method or constructor.

It is a compile-time error if a lambda body can throw some exception class E when E is a checked exception class and E is not a subclass of some class declared in the throws clause of the function type targeted by the lambda expression.

It is a compile-time error if a class variable initializer (§8.3.2) or static initializer (§8.7) of a named class or interface can throw a checked exception class.

It is a compile-time error if an instance variable initializer (§8.3.2) or instance initializer (§8.6) of a named class can throw a checked exception class,

unless the named class has at least one explicitly declared constructor and the exception class or one of its superclasses is explicitly declared in the throws clause of each constructor.

It is a compile-time error if a catch clause can catch checked exception class E1 and it is not the case that the try block corresponding to the catch clause can throw a checked exception class that is a subclass or superclass of E1,

unless E1 is Exception or a superclass of Exception.

It is a compile-time error if a catch clause can catch an exception class E1 and a preceding catch clause of the immediately enclosing try statement can catch E1 or a superclass of E1.


根据上面所述,矮矬穷泡妞本身都被排除掉了,只有有一项特长,才能泡妞!

最简单的方法是抛出一个异常或者子异常:

import java.io.IOException;
public class TryCatchException {
 public static void main(String[] args) {
 try {
  System.out.println("Hello world");
  throw new IOException();//或者子异常,如throw new FileNotFoundException();
 } catch(IOException e) {
  System.out.println("抓到一个IO 异常!");
 }
 }
}

try-catch 之二高富帅泡妞

那来看看这个吧!打印什么?

public class TryCatchException {
 public static void main(String[] args) {
  try {
    System.out.println("hello world!");
  } catch(Exception e) {
    System.out.println("捕获到异常");
  }
 }
}

可能不少人会说,不是和上面的一样嘛!会报编译异常。

哈哈,你掉到坑里了!它打印

hello world!

不管与其相对应的 try 子句的内容是什么,捕获 Exception 或者 Throwable 的 catch 语句是 ok 的,这点 JSL 并没有说清楚。

总之,高富帅泡妞总是很超脱的,很多妞也愿意倒扑!

try-catch 之三泡妞技可以继承吗?

我们来看看异常如何继承的吧:

public interface FileNotFound {
  void run() throws FileNotFoundException;
}
public interface CloneNotSupported {
  void run() throws CloneNotSupportedException;
}
public class TryCatchException implements FileNotFound,CloneNotSupported {
  public static void main(String[] args) {
    TryCatchException e=new TryCatchException();
    e.run();
 }
 @Override
 public void run() {
  System.out.println("Hello world"); 
 }
}

上面的程序可以编译通过吗?不少人会说,不能通过编译!原因:TryCatchException 继承了 FileNotFound 和 CloneNotSupported 的方法,同时必然继承它的异常,故必须捕获这两个异常。

你再次避过了正确答案!可以正确编译,且打印出结果。

一个方法可以抛出的受检查异常的集合时,它所适用所有类型声明要抛出的受检查异常的交集,而不是合集。


目录
相关文章
|
12月前
|
Java 开发者
Java 中的异常处理:不仅仅是 try-catch
在Java的世界里,异常处理是代码的守护神,它保护着程序不会因为意外错误而崩溃。但异常处理远不止try-catch那么简单。本文将深入探讨Java的异常处理机制,从基本的try-catch到更复杂的自定义异常和finally块的使用,带你理解如何在Java中优雅地处理错误。
141 1
|
Java 编译器 测试技术
深入探讨:try-catch对Java性能的影响
在Java编程中,异常处理是一个不可或缺的部分。使用`try-catch`块可以捕获和处理异常,防止程序崩溃。然而,关于`try-catch`对性能的影响,开发者们持有不同的观点。本文将深入探讨`try-catch`对Java程序性能的影响,并提供一些最佳实践。
234 5
|
Java
Java中的try-catch
如何在Java中用try-catch优雅地处理异常
225 2
Java中的try-catch
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
306 2
|
Java 程序员 开发者
Java中的异常处理:不仅仅是try-catch
【10月更文挑战第20天】在Java的世界里,异常处理是构建健壮应用程序不可或缺的一部分。它不仅仅是关于try-catch语句的简单使用,而是一种确保程序在遇到不可预测的错误时能够优雅地恢复或终止的机制。本文将深入探讨Java异常处理的核心概念,并通过实际代码示例展示如何有效地管理和处理异常。我们将从基础的try-catch块开始,逐步过渡到更复杂的异常处理策略,包括finally块的使用、自定义异常类的创建以及异常链的应用。准备好让你的Java异常处理技能升级吧!
|
Java 数据库连接 数据库
Java中的异常处理:不仅仅是try-catch
【10月更文挑战第20天】在Java编程世界中,异常处理是代码编写的基石之一。它不仅关乎程序的健壮性,也体现了开发者对潜在错误的预见与处理能力。本文将深入探讨Java的异常处理机制,揭示其背后的设计哲学,并通过实际案例展示如何优雅地管理异常。我们将一同见证,如何在面对错误时,不仅“捕捉”它们,更要“理解”它们,最终“利用”它们来提升代码质量。
|
Java 数据库连接 UED
Java中的异常处理:不仅仅是try-catch
【9月更文挑战第34天】在Java编程中,异常处理是维护程序健壮性的重要环节。本文将深入探讨Java的异常处理机制,从基础的try-catch语句到更复杂的自定义异常和finally块的使用。我们将通过实际代码示例,展示如何有效地管理异常,确保程序即使在面对错误时也能优雅地继续运行。
147 3
|
Java 数据库连接 开发者
Java中的异常处理:不仅仅是try-catch
【9月更文挑战第21天】在Java的世界里,异常处理是代码的守护神,它确保我们的程序在遇到不可预见的错误时不会崩溃。但你知道吗?异常处理不仅仅是try-catch那么简单。本文将深入探讨Java异常处理的机制,包括自定义异常、finally块的重要性,以及如何优雅地处理异常链。让我们一起揭开异常处理的神秘面纱,学会更高效、更专业的异常管理技巧。
|
Java 数据库连接 开发者
Java中的异常处理:不仅仅是try-catch
【8月更文挑战第26天】在Java的世界中,异常处理是代码健壮性的基石。它不仅仅是try-catch语句那么简单,而是一套完整的机制,涉及到异常的分类、传播以及处理策略。本文将深入探讨Java异常处理的各个方面,从基本语法到高级应用,旨在帮助开发者更好地理解和运用这一机制,以编写出更加稳定和可靠的代码。
Java中的异常处理:不仅仅是try-catch
在Java的世界里,异常处理是代码健壮性的守护神。它不仅仅是try-catch的简单运用,而是一种深入语言核心的设计哲学。本文将带你领略异常处理的艺术,从基础语法到高级技巧,让你的代码在风雨中屹立不倒。