可能重复:
Java:封装Integer.parseInt()的好方法
如何将字符串转换为float并避免在java中使用try/catch?
C#有Int.TryParse:Int32.TryParse方法(String,Int32%)
这种方法的优点在于它不会为坏数据抛出异常.
在java中,Integer.parseInt("abc")将抛出异常,并且在可能发生这种情况的情况下,很多性能将受到影响.
对于那些性能问题的情况,有没有办法解决这个问题?
我能想到的另一种方法是针对正则表达式运行输入,但我必须测试以查看更快的内容.
我有一个项目,我们经常使用它将Integer.parseInt()String转换为int.当出现问题时(例如,String不是数字而是字母a或其他),此方法将引发异常.但是,如果我必须在我的代码中处理各种异常,那么这很快就会变得非常难看.我想把它放在一个方法中,但是,我不知道如何返回一个干净的值,以表明转换出错了.
在C++中,我可以创建一个接受指向int的指针的方法,让方法本身返回true或false.但是,据我所知,这在Java中是不可能的.我还可以创建一个包含true/false变量和转换值的对象,但这似乎也不理想.对于全局值也是如此,这可能会给我带来一些多线程的麻烦.
那么有一个干净的方法吗?
看到Java没有可空类型,也没有TryParse(),如何在不抛出异常的情况下处理输入验证?
通常的方式:
String userdata = /*value from gui*/
int val;
try
{
val = Integer.parseInt(userdata);
}
catch (NumberFormatException nfe)
{
// bad data - set to sentinel
val = Integer.MIN_VALUE;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用正则表达式来检查它是否可解析,但这似乎也是很多开销.
处理这种情况的最佳做法是什么?
编辑:理由:关于异常处理,有很多关于SO的讨论,一般的态度是异常应仅用于意外情况.但是,我认为糟糕的用户输入是预期的,并不罕见.是的,这确实是一个学术观点.
进一步编辑:
一些答案证明了SO究竟出了什么问题.你忽略了被问到的问题,并回答了与之无关的另一个问题.问题不是要求层之间的过渡.如果数字是不可解析的,那么问题不在于询问返回什么.如你所知,val = Integer.MIN_VALUE; 对于完全无上下文的代码片段来自应用程序的应用程序来说,它是完全正确的选项.
我知道很容易我可以使用try/catch来检查命令行参数是否为double.
我正在寻找一种方法来检查这一点,而无需使用昂贵的try/catch块.我对Java很新.我在一些论坛上搜索过,但没有发现任何与我的问题有关的内容.
System.out.println(Double.parseDouble(args[1]));
Run Code Online (Sandbox Code Playgroud)
^^这将导致错误.除了把它放在一个try/catch中,有人会指向我进行数据验证,这会阻止这个吗?假设args [1]是一串文本.