2013-09-03 3 views
0

두 개의 arraylists (노트 및 0)의 텍스트 파일에서 데이터 (점 : x, y)를 차별화하여 저장하려고합니다. 데이터 파일에는 정수 또는 십진수 값만 포함됩니다.NumberFormatException parseInt Java

Data File: 
x y type(zero/knot) 
46 10  2 
13 5  2 
27 21  1 

하지만 내 코드를 던지고는 NumberFormatException은 48

import java.util.*; 
import java.util.ArrayList; 
import java.io.*; 
import java.awt.Point; 

public class program { 

    public static void main(String []args) { 
     ArrayList knots = new ArrayList<Point>(); 
     ArrayList zeros = new ArrayList<Point>(); 
     List<Integer> list = new ArrayList<Integer>(); 
     String line = null; 
     String file = "data1.txt"; 
     BufferedReader reader; 
     try { 
      reader = new BufferedReader(new FileReader(file)); 
      while((line = reader.readLine()) != null) { 
       String tmp[] = line.split(" "); 
       System.out.println(line); 
       for (String s:tmp) { 
        s = s.replace("\r\n",""); 
        int i = Integer.parseInt(s.trim()); 
        //knots.add(new Point(); 
       System.out.println(s); 
       } 
      } 
     } 

     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
      } 
     } 
+0

파일 헤더 행 때문일 수 있습니까? – kosa

+0

"x y 유형 (제로/매듭)"이라는 줄이 실제로 파일에 없습니까? – androiddev19

+0

문자열을 허용하려고합니다. – newuser

답변

0

당신은 당신이뿐만 아니라 진수를 파싱 말했다. 그것들은 Integer.parseInt()으로 분석 할 수 없습니다. 문자열에서 10 진수 값을 구문 분석하려면 Double.parseDouble() 또는 Float.parseFloat()을 사용해야합니다.

또한 파일에서 헤더를 구문 분석하려는 것 같습니다. 데이터 읽기를 시작하기 전에 readLine() 토큰을 호출해야합니다. 그렇지 않으면 텍스트를 구문 분석하려고 시도 할 것이고 이는 의미가 없으며 충돌합니다.

+0

지금 당장은 정수 값을 처리하려고하는데 두 개의 별도 데이터 파일이 있습니다. – user2398101

+0

그렇다면 두 번째 단락의 조언이 적용될 수 있지만 다른 파일을 읽을 때 부동 소수점 값을 파싱하는 것이 중요합니다. – Kon

+0

"x y type"은 일러스트레이션 용이며 실제 파일에는 없습니다. – user2398101

1

/이 비어 있다는 것을 나타내는 것 같다

46 10  2 
46 
Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:504) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at testparser.TestParser.main(TestParser.java:47) 

... 난 당신이 코드를 실행하면

46 10  2 
13 5  2 
27 21  1 

, 내가 출력을 얻을 ... 파일 내용을 정확히 가정 출력 빈 문자열 ... 나는이 부분을 교체하는 경우

...

for (String s : tmp) { 
    s = s.replace("\r\n", ""); 
    int i = Integer.parseInt(s.trim()); 
    //knots.add(new Point(); 
    System.out.println(s); 
} 
당신이 그것을 무시 할 수 있어야한다, 그래서 함께 ...

for (String s : tmp) { 
    s = s.trim(); 
    if (s.length() > 0) { 
     int i = Integer.parseInt(s.trim()); 
     //knots.add(new Point(); 
     System.out.println(s); 
    } 
} 

내가 할

...

46 10  2 
46 
10 
2 
13 5  2 
13 
5 
2 
27 21  1 
27 
21 
1 

잊지 마세요, readline는 줄 끝을 반환하지 않습니다.)

대신, 당신은 String tmp[] = line.split("\\s+");를 사용하는 경우,

line.split(" ")는 각각 "개인"공간에 spliting 당신이 함께 하나 개 이상의 공백 문자가있는 경우, 다음은 제 2 공간 ...을 반환 것을 의미한다 다른 모든 문자 사이의 공백으로 나뉘어집니다. "공백"을 반환하지 않습니다. String (if (s.length() > 0) { 체크가 중복 됨)

+0

감사합니다. – user2398101

+0

@ user2398101 다행히 도울 수있었습니다. – MadProgrammer

1

문제가 분리 선에 있습니다. 이것은 다음과 같아야합니다 String a[]=s.split(" +"); 귀하의 경우에는 어떤 일이 발생합니까? " "으로 "46 10 2"문자열을 나눌 때 문자열을 분할하기위한 공간이 하나만 계산됩니다. 따라서 4610 뒤에 하나의 공백을 무시한 다음 문자열을 찾습니다. 하지만 하나의 공백 뒤에는 문자열이 없으므로 ""을 문자열로 사용하고 정수로 파싱을 시도합니다. ""는 정수로 구문 분석 할 수는 없지만, 그것은 내가이 당신을 도움이되기를 바랍니다 나

import java.util.ArrayList; 
import java.io.*; 
import java.awt.Point; 

public class program 
{ 
    public static void main(String []args) 
    { 
     ArrayList knots = new ArrayList<Point>(); 
     ArrayList zeros = new ArrayList<Point>(); 
     List<Integer> list = new ArrayList<Integer>(); 
     String line = null; 
     String file = "data1.txt"; 
     BufferedReader reader; 
     try 
     { 
      reader = new BufferedReader(new FileReader(file)); 
      while((line = reader.readLine()) != null) 
      { 
       String tmp[] = line.split(" "); 
       System.out.println(line); 
       for (String s:tmp) 
       { 
        if(! (s.isEmpty())) 
        { 
         int i = Integer.parseInt(s.trim()); 
         System.out.println(s); 
        } 
       } 
      } 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

을 위해 잘 작동 .. 당신이 코드를 시도 할 수 있습니다 NumberFormatException이

0

가 발생합니다.