问题标签 [checked-exceptions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1020 浏览

java - 如果未处理 RuntimeException,我可以设置 Eclipse 以显示警告吗?

我有以下代码:

是否有任何 Eclipse 配置可以在方法声明中声明但未在行中捕获的未捕获运行时异常上显示警告/错误willItThrowException();

0 投票
3 回答
212 浏览

java - Java异常和内部异常,我这样做正确吗?

我正在针对 xsd 验证 xml,并且我发现在许多情况下必须处理异常。

我相信这些在java中被称为检查异常?

我应该如何编写这个代码块?

我是否使用嵌套在 try/catch 中的 try/catch?

0 投票
2 回答
8470 浏览

java - Guava 缓存和保留检查的异常

我正在重构一些代码以使用guava Cache

初始代码:

为了不破坏某些东西,我需要按原样保留任何抛出的异常,而不是包装它。

当前的解决方案看起来有些难看:

有没有办法让它变得更好?

0 投票
8 回答
216177 浏览

java - 为什么调用函数时需要“抛出异常”?

为什么编译器会报告方法show2()、、show3()main()

未报告的异常 必须捕获或声明要抛出的异常

当我throws Exception从这些方法中删除?

0 投票
3 回答
7149 浏览

java - 当您的方法签名不允许抛出异常时如何抛出异常?

我有这样的方法:

我想扔一个Exception里面getSomething()。编译器不允许我这样做,因为我的方法不允许Exception被扔在那里。但是我需要Exception为我的测试抛出一个子类(我不能抛出 Unchecked Exception。这显然是一个 hack,但我需要它来进行测试。我尝试了 EasyMock,但它也不允许我这样做。任何想法如何做到这一点?

谢谢,肖恩阮

0 投票
5 回答
4700 浏览

java - JLS 的哪些部分证明能够像未经检查一样抛出已检查异常?

最近发现并在博客中提到了这样一个事实,即可以通过 javac 编译器偷偷检查一个已检查的异常并将其抛出到不应抛出的地方。这在 Java 6 和 7 中编译并运行,抛出一个SQLExceptionthrowsorcatch子句:

生成的字节码表明 JVM 并不真正关心已检查/未检查的异常:

JVM 接受这一点是一回事。但我对Java 语言是否应该存在一些疑问。JLS 的哪些部分证明了这种行为?它是一个错误吗?还是 Java 语言的一个隐藏得很好的“特性”?

我的感受是:

  • doThrow0()'s<E>必然RuntimeExceptiondoThrow(). 因此,不需要遵循JLS §11.2throws条款。doThrow()
  • RuntimeException与 赋值兼容,因此编译器不会生成Exception强制转换(这将导致 a )。ClassCastException
0 投票
4 回答
776 浏览

java - 很难理解已检查和未检查的异常

我已经阅读了有关此的所有内容,但我仍然不明白如何使用已检查和未检查的异常。我想我仍然无法理解这个概念。我在 StackOverflow 上阅读过,最好使用未检查的异常而不是检查的异常,但是 Eclipse强制我使用检查的异常,如FileNotFoundException(AFAIK,如果 Eclipse 强制我插入一个 try/catch 块,它是一个检查的异常)。我想知道,有什么办法可以将检查翻译成未检查?到底在处理什么?我不明白处理异常是什么。

我在这里有这个例子,我真的很想知道如何处理(?)这个。这是一个检查异常,对吧?

我见过人们在这里做的各种事情。有些打印堆栈跟踪,这是我通常做的,我看不出它有什么问题。它为我提供了调试所需的信息。有些人忽略它们,我认为不应该这样做(我看到 JNode OS 引导程序忽略了一个异常)。有些人只是throws在签名中添加声明。有些会在那个东西里面抛出更多异常!(我想也许这就是使用未检查而不是检查的意思?)

此外,如果您添加throws声明,您将被迫进一步放置一个 try/catch 块,如果您有一个非常大的应用程序,这很不方便。对不起,我只是一无所知。完全地。我正在努力学习优秀而优雅的设计,这对我来说是一种折磨。

0 投票
4 回答
584 浏览

java - 处理灾难性异常

我在一本 C# 介绍性书中读到,如果您不知道如何处理异常,则不应捕获异常。想到用 Java 编程时的那一点建议,我有时发现我不知道如何处理异常,但我不得不捕捉它或“渗透它”以避免编译错误。我宁愿不要throws在调用树的整个过程中使用带有子句的混乱方法,所以我经常求助于将异常“转换”为 a RuntimeException,如下所示。将throws子句添加到许多方法中以处理没有真正“处理”(正确处理)的异常似乎冗长且分散注意力。以下是不好的风格,如果是这样,有什么更好的方法来处理这个问题?

编辑:除了混乱之外,渗透异常还有另一个问题:在代码修订之后,您可能最终会遇到一些不必要的throws子句。我知道清除它们的唯一方法是反复试验:删除它们并查看编译器是否抱怨。显然,如果您想保持代码干净,这很烦人。

0 投票
2 回答
134738 浏览

java - 如何修复调用 Thread.sleep() 时未处理异常的编译错误?

我是 Java 新手,也是编程新手(我知道直接进入 Java 可能不是最好的主意。)无论我如何尝试在我的程序中添加暂停,我都一直遇到错误。我正在做一个简单的计数程序,并想在每个数字之间添加一秒的延迟,这是我到目前为止的代码:

调用Thread.sleep()不会编译。编译器说,“未报告的javac异常 InterruptedException;必须被捕获或声明为抛出”,而 Eclipse 说,“未处理的异常类型 InterruptedException”

0 投票
9 回答
46919 浏览

java - Java 8:在 lambda 表达式中强制检查异常处理。为什么是强制性的,而不是可选的?

我正在使用 Java 8 中的新 lambda 功能,发现 Java 8 提供的实践非常有用。但是,我想知道是否有一种解决以下方案的好方法。假设您有一个对象池包装器,它需要某种工厂来填充对象池,例如(使用java.lang.functions.Factory):

将函数式接口转化为 lambda 表达式后,上面的代码变成了这样:

确实没那么糟糕,但是检查的异常java.sql.SQLException需要lambda 内的try/块。catch在我公司,我们长期使用两个接口:

  • IOut<T>相当于java.lang.functions.Factory;
  • 以及通常需要检查异常传播的情况的特殊接口:interface IUnsafeOut<T, E extends Throwable> { T out() throws E; }.

两者IOut<T>IUnsafeOut<T>都应该在迁移到 Java 8 期间被删除,但是没有完全匹配的IUnsafeOut<T, E>. 如果 lambda 表达式可以像未检查一样处理已检查的异常,则可以在上面的构造函数中像下面这样简单地使用:

这样看起来干净多了。我看到我可以重写ObjectPool超类来接受我们的IUnsafeOut<T>,但据我所知,Java 8 还没有完成,所以可能会有一些变化,比如:

  • 实现类似的东西IUnsafeOut<T, E>?(老实说,我认为这很脏 - 主题必须选择接受什么:要么Factory或不能具有兼容方法签名的“不安全工厂”)
  • 只是忽略 lambdas 中的检查异常,所以不需要IUnsafeOut<T, E>代理?(为什么不呢?例如另一个重要的变化:我使用的 OpenJDKjavac现在不需要将变量和参数声明为final在匿名类 [功能接口] 或 lambda 表达式中捕获)

所以问题通常是:有没有办法绕过 lambdas 中的已检查异常,还是在 Java 8 最终发布之前计划在将来?


更新 1

嗯,据我了解我们目前所拥有的,目前似乎没有办法,尽管引用的文章是 2010 年的:Brian Goetz 解释 Java 中的异常透明度。如果在 Java 8 中没有发生太大变化,这可以被视为一个答案。Brian 还说interface ExceptionalCallable<V, E extends Exception>(我提到IUnsafeOut<T, E extends Throwable>的代码遗留问题)几乎没有用,我同意他的观点。

我还想念别的东西吗?