2013-08-07 4 views
0

Я видел различные методы разделения строки. Я пробовал как с this.Отделите строку пробелом

Я пытаюсь прочитать и разделить следующую строку: {2b 00 00}

я вижу, что наиболее распространенный случай, чтобы разделить сообщение, разделенные «:», но в этом случае, мое сообщение разделенных пробелами ,

Стараясь оба пути, с регулярной split() функции или с StringTokenizer я получаю «NullPointerException», что я supose, что является причиной, из-за пространства:

private String splitReceivedString(String s) { 
    String[] separated = s.split(" "); 
    return separated[1]; 
} 

Как я могу получить значения этот тип струны?

ADDED КОД С ВОЗМОЖНАЯ ПРОБЛЕМА

После проверки некоторые из ваших ответов, я понимаю, что проблема исходит от связи Bluetooth InputStream. Я получаю от него нулевые значения. Итак, вот код, который я использую для получения сообщений:

Код почти такой же, как пример bluetoothChat. Но он модифицирован, чтобы адаптироваться к моей программе, так что, возможно, я что-то не так.

У меня есть MCU, который возвращает мне эту строку {2b 00 00}, когда я отправляю ей еще одну строку. Я думаю, что это будет сделано в connectedThread:

public class ConnectedThread extends Thread { 

    public void run() { 
    byte[] buffer = new byte[1024]; // buffer store for the stream 
    int bytes; // bytes returned from read() 

    /**Keep listening to the InputStream until an exception occurs*/ 
    while (true) { 
     try { 
      /**Read from the InputStream*/ 
      bytes = GlobalVar.mmInStream.read(buffer); 

      /**Send the obtained bytes to the UI activity*/ 
      GlobalVar.mHandler.obtainMessage(GlobalVar.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); 

Таким образом, это посылает мне строку в функции обработчика в основной деятельности:

public final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case GlobalVar.MESSAGE_STATE_CHANGE: 
       //The code here is irelevant 
      case GlobalVar.MESSAGE_WRITE: 
       byte[] writeBuf = (byte[]) msg.obj; 
       /**construct a string from the buffer*/ 
       String writeMessage = new String(writeBuf); 
       GlobalVar.mCommunicationArrayAdapter.add(writeMessage); 
       break; 
      case GlobalVar.MESSAGE_READ: 
       byte[] readBuf = (byte[]) msg.obj; 
       /**construct a string from the valid bytes in the buffer*/ 
       String readMessage = new String(readBuf); 
       GlobalVar.mCommunicationArrayAdapter.add(readMessage); 
       GlobalVar.readString = readMessage;      
       break; 

Затем переменная GlobalVar.readString является тот, Я получаю в функции разделенной:

private String splitReceivedString (String s) { 

     String[] separated = s.split(" "); 
     return separated[1]; 
    } 

    receive1 = splitReceivedString (GlobalVar.readString); 

Итак, дело в том, что он не читает право принимаемой строки, и я не знаю, как это исправить.

+7

Держу пари, вы передаете 'null' методу. – arshajii

+0

@arshajii Что вы имеете в виду? Я прочитал строку, которую хочу разбить с помощью тоста, и является exaccty'2b 00 00' – masmic

+0

@arshajii правильно, я протестировал этот метод, и он отлично работает. Строка, в которой вы проходите, либо отличается от '{2b 00 00}', либо вы передаете нуль. – Brinnis

ответ

1

Если вы получаете NullPointerException, это невозможно из-за строки " ", вы переходите к функции split - это определенно не равно нулю. Кажется, что String s, который вы получаете в качестве параметра своего метода splitReceivedString, - null по любой причине.

+0

Ну, да, это может быть. Я разрабатываю приложение bluetooth, основанное на bluetoothChat exmample. Строка, которую я вставляю туда, представляет собой строку, которую я получаю через bluetooth, поэтому я получаю ее из переменной 'readString' из обработчика. Я утверждал, что это правильно, потому что, когда вы делаете тост за эту переменную, я вижу в приложении строку '2b 00 00'. Итак, что я мог сделать? – masmic

+0

его, потому что разделение строки с использованием .split ("") не вернет ничего, поскольку "" не является правильным синтаксисом выражения regualr, который требуется для метода .split. Таким образом, нулевой указатель. – KBusc

+0

@KBusc: split никогда не возвращает 'null'. См. Также здесь: http://stackoverflow.com/a/6902125/55787 – chiccodoro

0

Вставьте некоторый вывод (System.out.println или другой) для отладки

  • что ваш s

  • Сколько элементов отделенный имеют

  • , что отделено [0 ] (если у вас есть только один элемент)

Попробуйте использовать

s.split("\\s"); 

Разделить на любые пробелы.

+0

переменная «s» - это строка, полученная, как я говорю в ответе @ chiccodoro, из входного потока bluetooth – masmic

+0

TM, добавлен код в основном вопросе, объясняющий, в чем проблема. – masmic

0

Я проверил ваш код в консольном приложении. Я изменил двойные кавычки на одинарные и была орфографическая ошибка ойна методы «Split»

static void Main(string[] args) 
    { 
     splitReceivedString("2b 00 00"); //1 
    } 

    public static string splitReceivedString(String s) 
    { 
     string[] separated = s.Split(' '); //2 
     return separated[1]; 
    } 
+0

Если я устанавливаю одиночные cuotes, я получаю эту ошибку: 'Метод split (String) в типе String не применим для аргументов (Char)' – masmic

+0

Потому что '' не является синтаксисом регулярных выражений – KBusc

+0

Можете ли вы скопировать строку кода где вы вызываете метод – beaumondo

0

Вы хотите использовать регулярное выражение для разбиения строки. Попробуйте вот так

String splitString = "2b 00 00"; 
String delim = "[ ]"; 
//here we split the string wherever we see a character matching 
//the inside of our square brackets. In this case a space 
String[] splitResults = splitString.split(delim); 

Я испытал это, и она работает дает следующие результаты

splitResults[0] = "2b" 
splitResults[1] = "00" 
splitResults[2] = "00" 
+0

Ничего подобного. Я думаю, что я получаю это из-за переменной readString из imputstream bluetooth. – masmic

+0

Добавлен код в основной вопрос, объясняющий, в чем проблема. – masmic

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