как вводить отдельные символы из .text-файла в массив [duplicate]

Возможно, это немного короче и понятнее:

import re
text = '... someline abc... someother line... name my_user_name is valid.. some more lines'
>>> re.search('name (.*) is valid', text).group(1)
'my_user_name'
3
задан Mark Rotteveel 8 March 2018 в 18:04
поделиться

1 ответ

Error Message:
    java.lang.StringIndexOutOfBoundsException: length=28; regionStart=1;
    regionLength=499 at java.lang.String.substring(String.java:1931) at     
    com.example.my.app.MainActivity$2.onResponse(MainActivity.java:50) at     
    com.example.my.app.MainActivity$2.onResponse(MainActivity.java:46) at     
    com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) at     
    com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) at     
    com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) at android.os.Handler.handleCallback(Handler.java:751) at     
    android.os.Handler.dispatchMessage(Handler.java:95) at     
    android.os.Looper.loop(Looper.java:154) at     
    android.app.ActivityThread.main(ActivityThread.java:6077) at     
    java.lang.reflect.Method.invoke(Native Method) at     
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at     
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Ошибка Описание

There is an IndexOutOfBound exception occurred in your MainActivity class 
Inside second inner class's OnResponse function as shown MainActivity$2onResponse
on line 46 which basically occurred during substring operation in String.java line 1931 
which was invoked from StringRequest.deliverResponse at line 60,
which was invoked from StringRequest.deliverResponse at line 30,
which was invoked from ExecutorDelivery.java at line 99,
which intially started from ZygoteInit$MethodAndArgsCaller's run function 
and reached up-to main thread of ActivityThread.main=>looper=>handler

Фактическая причина

Ваш код пытается создать подстроку с

starting index = 0
ending index = 500

, хотя ваша фактическая строка ответа length is = 28, поэтому длина строки недостаточно длинна, чтобы создать подстроку в 500 символов.

Решения:

  1. Проверять длину с помощью тройного оператора ?:
    mTextView.setText("Response is: "+ 
       ((response.length()>499) ? response.substring(0,500) : "length is too short"));
    
    Примечание: Тернарный оператор (?:) является коротким выражением if else, но не является выражением , означающим, что он не может встречаться как атомный оператор, такой как INVALID, потому что нет назначения
    ((someString.length()>499) ? someString.substring(0,500):"Invalid length");
    
  2. if-else повышает видимость
    String msg="Invalid Response";
    if(response.length()>499){
        msg=response.substring(0,500);
    }
    mTextView.setText("Response is: "+msg);
    
    //or     mTextView.setText("Response is: "+response);
    

Что такое IndexOutOfBoundsException?

IndexOutOfBoundsException является подклассом RuntimeException означает, что это неконтролируемое исключение, которое бросается, чтобы указать, что какой-либо индекс (например, массив, строка или вектор) находится вне диапазона.eg, используя List.

< / blockquote>

, как показано в Documentation

List<String> ls=new ArrayList<>();
      ls.add("a");
      ls.add("b");
      ls.get(3); // will throw IndexOutOfBoundsException , list length is 2

Предупреждение:

String str = "";
int index =3; 
if(index < ls.size())    // check, list size must be greater than index
    str = ls.get(index);
else
    // print invalid index or other stuff

Использование конструктора классов с индексом или строковым сообщением

public IndexOutOfBoundsException() {
    super();
}

public IndexOutOfBoundsException(String s) {
    super(s);
}

Какие другие варианты / подклассы IndexOutOfBoundsException?

  • ArrayIndexOutOfBoundsException : Это указывает что к массиву обратился незаконный индекс. Индекс отрицателен или больше или равен размеру массива, например,
    int arr = {1,2,3}
    int error = arr[-1]; // no negative index allowed
    int error2 = arr[4]; // arr length is 3 as index range is 0-2
    

Предупреждение:

int num = "";
int index=4;
if(index < arr.length)     // check, array length must be greater than index
    num = arr[index];
else
    // print invalid index or other stuff
  • StringIndexOutOfBoundsException : это порождается методами String, чтобы указать, что индекс либо отрицательный, либо больше, чем размер строки. Для некоторых методов, таких как метод charAt, это исключение также генерируется, когда индекс равен размеру строки.
    String str = "foobar";       // length = 6
    char error = str.charAt(7);  // index input should be less than or equal to length-1
    char error = str.charAt(-1); // cannot use negative indexes
    

Предотвращение:

String name = "FooBar";
int index = 7;
char holder = '';
if(index < name.length())     // check, String length must be greater than index
    holder = name.charAt(index) ;
else
    // print invalid index or other stuff

Примечание: length() является функцией класса String, а length является ассоциативным полем array.

Почему происходит это исключение?

  • Использование отрицательного индекса с функциями arrays или charAt, substring
  • BeginIndex меньше 0 или endIndex больше длины входной строки для создания substring или beginIndex больше, чем endIndex
  • Когда результат endIndex - beginIndex меньше 0
  • Когда строка ввода / массив пуста

INFO: Задача JVM - создать объект соответствующего исключения и передать его туда, где оно произошло с помощью throw ключевое слово или вы также можете сделать это вручную, используя также ключевое слово throw.

if (s == null) {
    throw new IndexOutOfBoundsException("null");
}

Как я могу это исправить?

  1. Анализ StackTrace
  2. Проверка входной строки в отношении недействительности, длины или допустимых индексов
  3. Использование отладки или журналов
  4. Использование блока catch общего исключения

1.) Анализ StackTrace [/ g1 0]

Как показано в начале этого сообщения, stacktrace предоставляет необходимую информацию в начальных сообщениях о том, где это происходит, почему это происходит, поэтому вы можете просто проследить этот код и применить требуемое решение.

, например, по причине StringIndexOutOfBoundsException, а затем ищите свой package name indicating your class file, затем перейдите к этой строке и не забывайте об этом, просто примените решение

. Это начало, если вы изучите исключение и его причина, а также в документации.

2.) Проверка строки ввода в отношении недействительности, длины или действительных индексов

В случае неопределенности, когда вы не знаете о фактическом вводе, таком как ответ поступает с сервера (или, может быть, это ошибка или ничего) или пользователя, тогда всегда лучше охватить все неожиданные случаи, хотя поверьте, что немногие пользователи всегда любят подталкивать пределы тестирования, поэтому используйте input!=null && input.length()>0 или для индексов, вы можете использовать тернарный оператор или if-else условия граничной проверки

3.) Использование отладки или журналов

Вы можете проверить работающая среда вашего проекта в режиме отладки путем добавления точек останова в вашем проекте и системе остановится там, чтобы дождаться вашего следующего действия, а между тем вы можете просмотреть значения переменных и других деталей.

Журналы точно так же, как и контрольные точки, поэтому, когда ваше управление пересекает эту точку, они генерируют детали, в основном это информативные сообщения, заданные системой увядания, или пользователь может также записывать сообщения журнала, используя либо журналы, либо сообщения Println

4.) Использование Блоки блокировки общего исключения

Try-catch всегда полезны для обработки RuntimeExceptions, поэтому вы можете использовать несколько блоков catch для обработки ваших возможных проблем и для получения соответствующих сведений

try {
     mTextView.setText("Response is: "+ response.substring(0,500));
} catch (IndexOutOfBoundsException e) {
    e.printStackTrace();
    System.out,println("Invalid indexes or empty string");
}
  catch (NullPointerException e) { // mTextView or response can be null 
    e.printStackTrace();
    System.out,println("Something went wrong ,missed initialization");
}
catch (Exception e) {  
    e.printStackTrace();
    System.out,println("Something unexpected happened , move on or can see stacktrace ");
}

Дальнейшие ссылки

Что такое исключение NullPointerException и как его исправить?

7
ответ дан Mark Rotteveel 15 August 2018 в 14:31
поделиться
  • 1
    Спасибо, но теперь он отображает только «все, что вы хотите отображать». Таким образом, response.length () не более 499. – traveller 12 October 2016 в 19:12
  • 2
    @traveller, потому что, как я сказал в своем ответе, длина вашего ответа равна 28, поэтому вы не можете создать строку из 500 символов и примерно «все, что хотите отобразить». , это всего лишь строка, поэтому все, что вы здесь дадите, будет отображаться – Pavneet_Singh 12 October 2016 в 19:14
  • 3
    @traveller проверяет обновленный ответ для ясности и может также прокомментировать код – Pavneet_Singh 12 October 2016 в 19:21
  • 4
    Кажется, я понял это сейчас. Моя строка составляет всего 28 символов, и я пытаюсь создать подстроку длиной 500, очевидно, я не могу, но я бы смог, если бы моя строка была длиннее 500 символов. – traveller 12 October 2016 в 19:27
  • 5
    Мне нужно спросить, почему 500 символов? Это максимальная длина текста? – traveller 12 October 2016 в 19:27
Другие вопросы по тегам:

Похожие вопросы: