2014-11-10 2 views
0

Я пытаюсь tokenize String и сохранять его в двоичном файле, но когда я запускаю программу, я получаю исключение NumberFormatException. Вот мой трассировки стека:NumberFormatException при попытке Tokenize String

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: " 1" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:481) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at Project6.saveBSAFile(Project6.java:187) 

Вот мой код, который пытается разбития String и сохранить его в двоичный файл:

public void saveBSAFile() throws FileNotFoundException, IOException 
    { 
     jfc.setDialogTitle("Specify a file to save"); 
     int userSelection = jfc.showSaveDialog(this); 

     if (userSelection == jfc.APPROVE_OPTION) 
     { 
      File filename = jfc.getSelectedFile(); 
      JOptionPane.showMessageDialog(null, "File to save " + filename, 
             "Save Review", JOptionPane.INFORMATION_MESSAGE); 

      FileOutputStream FOStream1 = new FileOutputStream(filename, true); 
      DataOutputStream DOStream1 = new DataOutputStream(FOStream1); 
     } 
     else if (userSelection == jfc.CANCEL_OPTION) 
     { 
      return; 
     } 

     int index = 0; 

     while (tools.getNumberOfItems() <= 10 && processRec.getToolRecords(index) != null) 
     { 
      StringTokenizer tokens = new StringTokenizer(processRec.getToolRecords(index), "|:"); 

      toolStrTok = tokens.nextToken(); 
      toolNameTok = tokens.nextToken(); 
      idStrTok = tokens.nextToken(); 
      idTok = tokens.nextToken(); 
      qualStrTok = tokens.nextToken(); 
      qualTok = tokens.nextToken(); 
      stockStrTok = tokens.nextToken(); 
      stockTok = tokens.nextToken(); 
      priceStrTok = tokens.nextToken(); 
      priceTok = tokens.nextToken(); 

      idTok.trim(); 
      qualTok.trim(); 
      stockTok.trim(); 
      priceTok.trim(); 

      id = Integer.parseInt(idTok); 
      quality = Integer.parseInt(qualTok); 
      numInStock = Integer.parseInt(stockTok); 
      price = Double.parseDouble(priceTok); 

      FileOutputStream FOStream2 = new FileOutputStream(filename, true); 
      DataOutputStream DOStream2 = new DataOutputStream(FOStream2); 

      DOStream2.writeUTF(toolStrTok); 
      DOStream2.writeUTF(" " + toolNameTok); 
      DOStream2.writeUTF(" " + idStrTok + " "); 
      DOStream2.writeInt(id); 
      DOStream2.writeUTF(" " + qualStrTok + " "); 
      DOStream2.writeInt(quality); 
      DOStream2.writeUTF(" " + stockStrTok + " "); 
      DOStream2.writeInt(numInStock); 
      DOStream2.writeUTF(" " + priceStrTok + " "); 
      DOStream2.writeDouble(price); 
      DOStream2.close(); 

      index++; 

     }//end loop 
    }//end saveBSAFile 

А вот струнный я пытаюсь разметить, который тянет из метода в другом файле класса (который в настоящее время ссылается вызовом processRec):

public String getRecord(int index) 
    { 
     return "Tool Name: " + toolArray[index].getName() 
       + "| Tool ID: " + toolArray[index].getToolID() 
       + "| Tool Quality: " + toolArray[index].getQuality() 
       + "| Number in Stock: " + toolArray[index].getNumberInStock() 
       + "| Tool Price: " + toolArray[index].getPrice(); 

    }//end getRecord 

Я пытался несколько различных вещей, таких как trimmi ng Strings с использованием trim() Я пытаюсь tokenize, но это, похоже, не работает :(Я также пытался немного переработать код, но это тоже не помогло мне. Я очень люблю новичков, когда дело доходит до исключений и следов стека, поэтому я надеялся, что кто-то сможет указать на очевидные (или не столь очевидные) ошибки, которые я могу сделать. Большое спасибо заранее

ответ

2

trim() method не изменил оригинал String; это неизменно.

Возвращает Строку, значение которого эта строка, с какими-либо начальными и конечными пробелами удалены.

(курсив мой)

Метод trim возвращает обрезанную String, но выбросить возвращенный String. idTok по-прежнему " 1", с пробелами.

Изменить

idTok.trim(); 

в

idTok = idTok.trim(); 

и также с другими маркерами. Затем parseInt будет видеть обрезанную строку (например, "1") и правильно разобрать целые числа.

+0

Ничего себе, и это была единственная вещь, в которой я был уверен, что получил правильный LOL. Возможно, мне нужен пересмотр истории. Я очень ценю, что ты это указываешь. – FuegoJohnson

Смежные вопросы