2017-03-05 56 views
-1

我想使用Integer.parseInt()将表示电话号码的字符串转换为我可以使用的int值。转换为int时出现Java字符串错误

这是我得到的错误:

Enter a 10-digit telephone number with optional space or dash after the first and the second block of three digits > 
5558759142 
Processing encrypted number "5558759142" 
Exception in thread "main" java.lang.NumberFormatException: For input string: "5558759142" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:583) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at TelephoneNumberValidator.main(TelephoneNumberValidator.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Process finished with exit code 1 

这是我的代码:

import java.util.*; 
import java.lang.Integer; 

public class TelephoneNumberValidator { 
    public static void main(String[] args) { 
     final String VALID_PHONE_PATTERN = "[0-9]{3}[-| ]?[0-9]{3}[-| ]?[0-9]{4}"; 
     final int NUMBERS_FOLLOWING_AREA_CODE = 7; 
     final int DECRYPTED_AREA_CODE = 212; 
     Scanner scanKeyboard = new Scanner(System.in); 
     String userInput; 

     do { 
      System.out.println("Enter a 10-digit telephone number with optional space or dash after the first and the second block of three digits >"); 
      userInput = scanKeyboard.nextLine(); 
      //check to see if the phone number is correct 
      if (!userInput.matches(VALID_PHONE_PATTERN)) 
      { 
       System.out.println("The given input \" " + userInput + " \" is not valid"); 
      } 
     }while (!userInput.matches(VALID_PHONE_PATTERN)); 

     //extract int from string 
     String phoneJustNumbers = userInput; 
     phoneJustNumbers = phoneJustNumbers.replaceAll("-",""); // replaces hyphens 
     phoneJustNumbers = phoneJustNumbers.replaceAll(" ", ""); 

     System.out.println("Processing encrypted number \"" + phoneJustNumbers + "\""); 
     //check the first 3 digits (aka area code) to see if it matches 212 
     int areaCode = Integer.parseInt(phoneJustNumbers);//gets area code 
     int placeholderForAreaCode = 111; //set 111 so that each number in area code can be accounted for 
     int placeholderForEntirePhoneNum = 1111111111; //set each digit to 1 so we can shift later 
     for (int j = 0; j <= 9; j++) 
     { 
      if ((areaCode + (placeholderForAreaCode * j) == DECRYPTED_AREA_CODE)) // we are shifting each digit by one 
                         // to see if it matches the decrypted area code 
      { 
       System.out.println("The telephone number is \"" + (Integer.parseInt(phoneJustNumbers) * placeholderForEntirePhoneNum * j) 
         + "\" with a shift value of " + j); 
      } 
      else 
      { 
       System.out.println("The telephone number \"" + userInput + "\" cannot be decrypted area code."); 
      } 
     } 

    } 
} 

所以,当我尝试刚刚替补它的工作原理使用的Integer.parseInt一个硬编码字符串() 。这导致我相信我生成清理我的字符串的方式不知何故阻止了它的工作。 我是新来的java,所以我不知道为什么会这样,或者我做错了什么。

回答

0

最大值int可以是2,147,483,647。 (请参阅Integer.MAX_VALUE。)您的示例电话号码比这个大得多。请尝试使用Long.parseLong(),因为long的最大值为9,223,372,036,854,775,807。

+0

是的,这是问题。非常感谢你! –

0

超出范围。您可以放入int的最大数字不符合您的数字表示的50亿的值。

尝试改为长。

或者,更好的方法是:使用特定的类来表示电话号码,例如,通过使用仅包含该号码数字的数组,还保留从用户获得的完整初始字符串。

事情是:电话号码包含数字这一事实并不意味着电话号码应该作为实数存储!

+0

是的,这是问题。非常感谢你! –

+0

然后,继续前进,接受你认为对你有帮助的答案。 – GhostCat

0

输入超过Integer可容纳(存储)的最大值。将数据类型更改为long以解决此问题。

似乎太多整数操作 - 也许创建一个电话类,有前缀等,作为单独的字段/属性,然后对他们采取行动。也许字符串的使用会更好,除非你需要做一些数学运算,转换是不可取的

相关问题