当前位置: 首页 > 面试题库 >

什么是预期的时候处理NumberFormatException的正确方法是什么?

公西季
2023-03-14
问题内容

我遇到这种情况,我需要将a解析String为an
int,但我不知道该如何处理NumberFormatException。当我没有抓住它时,编译器不会抱怨,但是我只是想确保自己能够正确处理这种情况。

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

我只想这样简化我的代码。编译器没有问题,但是线程在上死掉了NumberFormatException

private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

Google CodePro希望我以某种方式记录该异常,并且我同意这是最佳实践。

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
        e.printStackTrace();
    }
    return i;
}

我希望0当当前片段不是数字或无法解析时返回此方法。当我没有NumberFormatException显式捕获时,是否不分配变量i?还是有一些默认值Integer.parseInt()返回?

一般风格表示,如果我捕获到异常,则应将其记录在某处。我不想记录它。有时会抛出此异常是正常的操作,这对我来说也不好。我找不到函数,但是会告诉我是否Integer.parseInt()会引发异常。因此,我唯一的行动方针似乎就是调用它并捕获异常。

该javadoc的为parseInt没有太大帮助。

以下是我想知道的具体问题:

  • 有没有可以调用的方法,该方法可以告诉我是否在调用前Integer.parseInt()抛出一个NumberFormatException?这样我就可以毫无问题地记录日志了,因为它永远都不会发生。
  • 如果我根本不捕获异常,是否不会分配变量?然后,当它不是数字时,我将简单地将其初始化为所需的值,并且不会捕获异常。
  • 有没有办法以某种方式明确标记我不关心的异常?我认为这将类似于AWTEvent.consume()。如果是这样,那么我将这样做,以便Google CodePro不会将其视为“未记录”。

问题答案:
  • 有没有可以调用的方法,该方法可以告诉我Integer.parseInt()在调用之前是否抛出NumberFormatException?这样我就可以毫无问题地记录日志了,因为它永远都不会发生。

可悲的是没有。至少不在核心Java API中。但是,编写一个很容易-只需修改下面的代码即可。

  • 如果我根本不捕获异常,是否不会分配变量?然后,当它不是数字时,我将简单地将其初始化为所需的值,并且不会捕获异常。

如果未捕获异常,则堆栈将展开,直到它到达将对其进行处理的catch块为止,否则它将完全展开并停止线程。实际上,不会分配该变量,但这并不是您想要的。

  • 有没有办法以某种方式明确标记我不关心的异常?我想这将类似于AWTEvent.consume()。如果是这样,那么我将这样做,以便Google CodePro不会将其视为“未记录”。

可能有一种方法可以告诉CodePro忽略此特定警告。当然,使用诸如FindBugs和Checkstyle之类的工具,您可以在特定位置关闭警告。(编辑:@Andy指出了如何执行此操作。)

我怀疑您想要的是@daveb提到的Commons lang软件包。编写这样的函数非常容易:

int parseWithDefault(String s, int def) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException e) {
        // It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
        return def;
    }
}


 类似资料:
  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 有几种方法可以在中获得时间: 使用模块 但是什么是处理日期的正确方法呢?

  • 问题内容: 我一直在使用spring-webflux进行一些研究,我想了解使用路由器功能处理错误的正确方法。 我创建了一个小项目来测试几个场景,并且我希望获得有关它的反馈,并查看其他人在做什么。 到目前为止,我在做什么。 提供以下路由功能: 我已经在我的处理程序上执行了 它们是我的错误处理程序: 这是完整的示例存储库: https://github.com/LearningByExample/re

  • 问题内容: 在PHP系统中,我有一个常见的MVC情况:从包含的数据中接收请求。现在,我有三种方法来处理数据: a)仅调用和处理数据。 b)在变换的数据转换成变量,并将它们传递到。 c)将数据转换为的域对象,并将该对象仅传递给。 目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。 因此,根据MVC,处理数据的正确方法是什么? 编辑 目前,我没有使用任何MVC框架。 编辑2 通常

  • 我有两个图像,一个是竖屏,另一个是横向模式。当移动设备视图旋转时,切换这些图像的最佳方式是什么? 目前我只显示肖像图像。当设备旋转到横向模式时,纵向图像只需拉伸即可。 我是否应该在方向旋转处理程序中进行检查,并简单地将图像重置为正确的方向图像(即根据方向手动设置)?? 谢谢