当前位置: 首页 > 知识库问答 >
问题:

如何知道try块中哪个变量是罪魁祸首?

史修谨
2023-03-14

在某个try块中,我有两个String变量,当我使用Integer.ParseInt(string1)Integer.ParseInt(string2)时,这两个变量可能导致NumberFormatException。问题是,如果Icatch一个异常,如何知道哪个字符串是麻烦制造者?我需要得到麻烦制造者的变量名。

下面是一些示例代码:

public class test {
    public static void main(String[] args) {
        try {
            String string1 = "fdsa";
            String string2 = "fbbbb";
            Integer.parseInt(string1);
            Integer.parseInt(string2);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        }
    }

e.printStackTrace()方法没有告诉我变量名;它只是告诉我捣乱者的内容。

java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)在java.lang.Integer.ParseInt(Integer.java:580)在java.lang.Integer.ParseInt(Integer.java:615)在test.main(Test.java:9)在sun.reflect.NativeMethodAccessorImpl.Invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.Invoke(NativeMethodAccessorImpl.Invoke)在

进程已完成,退出代码为0

我需要知道变量名称的原因是我需要提示用户正在发生什么。例如,通过使用

System.out.println(troubleMakerName + "is wrong!")

在我的需求中,用户应该输入

fd=(fileName,maxLength,minLength)

然后我将分析输入字符串并创建一些响应。因此,我想检查maxLengthminLength是否会抛出NumberFormatException。在这种情况下,如果minLength有错误,那么我需要提示用户minLength是错误的。

共有1个答案

郝修为
2023-03-14

你有一个XY问题。

您不想读取实际的变量名。您希望能够验证输入并向用户提供合理的错误消息

String fileName, maxLengthInput, minLengthInput;
int maxLength, minLength;

List<String> errors = new ArrayList<>();

try {
    maxLength = Integer.parseInt(maxlengthInput);
} catch (NumberFormatException nfe) {
    errors.add("Invalid input for maximum length, input is not a number");
}

try {
    minLength = Integer.parseInt(minlengthInput);
} catch (NumberFormatException nfe) {
    errors.add("Invalid input for minimum length, input is not a number");
}

// show all error strings to the user

不是直接抛出异常,而是收集异常,这样您就可以一次通知用户所有无效输入(可能用红色突出显示相关字段),而不是让用户修复一个输入,尝试再次提交,然后发现另一个输入也是错误的。

 类似资料:
  • 方法链接好吗? 我并不反对经常使用方法链的函数式编程,而是反对一种从众心态,即人们盲目地追逐新事物。 这个例子,如果我正在使用流编程处理项目列表,并且需要找出导致抛出的确切行。 因此,在上面的示例中,如果list中的任何对象为null,则在调用< code>x.getAddress()时,它将导致< code > NullPointerException 并退出,而没有给我们一个钩子来标识有此问题

  • 问题内容: 构建失败时,我正在尝试向罪犯发送电子邮件。如果我手动启动构建,则发送电子邮件,但是如果我通过SCM轮询启动构建,则不会发送电子邮件,并且构建的控制台输出将显示以下消息: 这是插件工作的正确方法吗(罪魁祸首应该是一个人,而不是scm polling)? 我正在使用: 操作系统:Ubuntu Server 11.04 Jekins:1.532.1 Email-ext plugin:2.37

  • 问题内容: 我是新手,所以请保持温柔。 因此,我已经在某些代码中使用互斥锁了几周了。我了解其背后的概念:锁定对特定资源的访问权限,与之交互(读或写),然后为其他人再次解锁。 我使用的互斥锁代码主要是复制粘贴调整。该代码可以运行,但是我仍在努力解决其内部问题。到目前为止,我一直在结构中使用互斥锁来锁定该结构。今天,我发现了这个例子,这使我完全不清楚互斥锁实际上是在锁定什么。以下是一段示例代码: 让我

  • 问题内容: 我在Linux Ubuntu服务器中搜索php.ini文件所在的路径,并且在执行命令时发现很多php.ini 。那么如何从php.ini所在的php脚本网页中确切地知道呢? 问题答案: 您可以使用php_ini_loaded_file() 取自php.net: 您可能还需要检查php_ini_scanned_files() 另外,您应该注意,如果从CLI运行PHP脚本,则有可能使用与服

  • 问题内容: 如何在try / except块内将变量设为公共? 此代码返回错误 NameError:名称“文本”未定义 如何在try / except块之外使变量文本可用? 问题答案: 语句不会创建新的作用域,但是如果调用引发异常,则不会设置该语句。您可能希望在子句中使用该行,以便仅在没有异常的情况下才执行该行。 如果以后需要使用,您真的需要考虑如果分配失败并且您无法致电,其值应该是什么。您可以在

  • 问题内容: 是否有可能在 ES6 设置的变量中使用严格模式? 由于定义超出范围,因此无法删除。看来可行的唯一方法是: 基本上,有什么方法可以代替这种情况吗? 问题答案: 将变量声明为要求您立即将其指向一个值,并且此引用不能更改。 表示您无法在某个位置(之外)进行定义,而在其他位置(内)为其赋值。 另一方面,在块内创建它并为其赋值都很好。 但是,它是块范围的,就像一样,因此,如果您确实在块中创建它并