2014-09-15 4 views
0

Я изменил код BluetoothChat, чтобы получать последовательные данные с микроконтроллера на мой Android-телефон. Когда я запускаю следующий фрагмент кода, он дает java.util.regex.PatternSyntaxException. Что такое ошибка? Почему это исключение происходит?java.util.regex.PatternSyntaxException

BluetoothChat.java

// The Handler that gets information back from the BluetoothChatService 
private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 

     case MESSAGE_WRITE: 

      byte[] writeBuf = (byte[]) msg.obj; 
      // construct a string from the buffer 
      String writeMessage = new String(writeBuf); 
      mConversationArrayAdapter.add(writeMessage); 
      break; 

     case MESSAGE_READ: 

      byte[] readBuf = (byte[]) msg.obj;  

      // construct a string from the valid bytes in the buffer 

      String readMessage = new String(readBuf, 0, msg.arg1); 

      if(readMessage.matches("*")) 
      { 
       mConversationArrayAdapter.add("Left"); 
      } 
      else 

      {mConversationArrayAdapter.add(readMessage);} 

} 

Лог-кошка:

 09-15 13:54:32.070: E/AndroidRuntime(21931): FATAL EXCEPTION: main 
     09-15 13:54:32.070: E/AndroidRuntime(21931): java.util.regex.PatternSyntaxException: Syntax   error in regexp 
pattern near index 1: 
     09-15 13:54:32.070: E/AndroidRuntime(21931): * 
     09-15 13:54:32.070: E/AndroidRuntime(21931):^
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.util.regex.Pattern.compileImpl(Native Method) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.util.regex.Pattern.compile(Pattern.java:400) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.util.regex.Pattern.<init>(Pattern.java:383) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.util.regex.Pattern.matches(Pattern.java:413) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.lang.String.matches(String.java:1765) 09-15 13:54:32.070: 
E/AndroidRuntime(21931): at 
com.example.footforthought.Sixth$2.handleMessage(Sixth.java:289) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at android.os.Handler.dispatchMessage(Handler.java:99) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at android.os.Looper.loop(Looper.java:137) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at android.app.ActivityThread.main(ActivityThread.java:4517) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.lang.reflect.Method.invokeNative(Native Method) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at java.lang.reflect.Method.invoke(Method.java:511) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at .android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
     09-15 13:54:32.070: E/AndroidRuntime(21931): at dalvik.system.NativeStart.main(Native Method) 

ответ

2

matches() использует регулярные выражения (regex) для соответствия входному сигналу и * является метасимволом регулярного выражения, что означает ноль или более предыдущего токена. Поскольку прежний токен отсутствует, это синтаксическая ошибка.

Если вы хотите, чтобы соответствовать * буквально, избежать его с обратной косой черты:

readMessage.matches("\\*") 

или использовать некоторые функции сравнения строк, таких как equals(), которые не используют регулярные выражения.

+0

Сэр, есть ли какие-либо изменения, если я читаю двухзначное число? "MConversationArrayAdapter.add (readMessage);" дает мне двузначное число в виде двух отдельных цифр. – user3211607

1

Вот ваша проблема:

if(readMessage.matches("*")

Если вы хотите, чтобы соответствовать everythin g, затем используйте ".*.

Также, как laalto говорит в своем ответе. Если вы хотите все сопоставить, вам нужно избежать * либо с помощью Pattern.quote(), либо просто используя две косые черты "\\*".

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