今天依旧是刷题的一天,在做LeetCode的题目8时遇到了一个问题
Exception in thread "main" java.lang.NumberFormatException: For input string: "20000000000000000000" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:592)
at java.lang.Long.parseLong(Long.java:631)
at com01.Code8.myAtoi(Code8.java:28)
at com01.Code8.main(Code8.java:50)
为什么会报错呢?仔细研究加推敲一番后,发现原来是因为这行代码Long.parseLong(str)
,str
转化为long
类型之后超出了long
的范围,错误就自然而然的产生了。那怎么修改一下程序呢?代码整体上是没有问题的,测试样例1079个过了1073个,不想大动干戈改代码,这就很尴尬了。怎么办呢,这个时候就想到了我能不能检测一下如果发生该错误,就针对该问题处理一下。这个时候try
、catch
就排上用场了。具体结构如下:
try{
可能发生异常的代码
}catch(异常的类型1 e) {
处理异常的代码
}catch(异常类型2 e){
处理异常的代码
}... // 可以有多个catch
finally{
最终一定要执行的代码
}
那么在这个结构中代码的执行顺序是怎样的呢?分为以下三个步骤执行
1. 从try
内发生异常的那一行代码,中断执行
2. 执行对应catch
内处理异常的代码
3. 继续执行try
、catch
结构之后的代码
了解了原理之后问题又来了,我知道发生异常了,但是异常类型又该怎么写?我怎么知道发生了哪个异常?小编也很苦恼,于是就上网搜了一下,结果发现异常的类型是真的多,看的人眼花缭乱,不过看得多了发现异常类型的后面都是以Exception
结尾的,那么再看看我们的报错信息,忽然发现有一个NumberFormatException
,有一种柳暗花明又一村的感觉哈哈,就抱着试一试的心态,结果发现没问题,程序正确运行。
通过解决这个错误呢,也算是真正了解到了try
、catch
的用法,实践操作了一把。之前是知道异常处理的,但也仅仅是纸上谈兵罢了,没有真正的使用过。总结下来,就是要仔细查看报错信息,不管是调试也好、还是使用异常处理,了解了错误的原因,离成功解决问题就不远了。下面贴一下题目的代码,比较简单,思路就不做介绍了
public int myAtoi(String str) {
String s = str.trim();
long result;
// 字符串为空
if(s.length() < 1 || s == null) {
return 0;
}
// 开始字符不是0~9且不为+-号
if((s.charAt(0)<'0' || s.charAt(0)>'9') && s.charAt(0)!='+' && s.charAt(0)!='-') {
return 0;
} else {
String sub = "" + s.charAt(0);
for(int i=1; i<s.length(); i++) {
if(s.charAt(i)>='0' && s.charAt(i)<='9') {
sub += s.charAt(i);
} else {
break;
}
}
if(sub.equals("+") || sub.equals("-")){
return 0;
} else {
try {
result = Long.parseLong(sub);
} catch(NumberFormatException e) {
if(sub.charAt(0) == '-') {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
if(result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if(result < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
} else {
return new Long(result).intValue();
}
}
}
}