java - ইনডেক্সআউট অফফাউন্ডস এক্সসেপশন কী? আমি কীভাবে এটি ঠিক করতে পারি?



android android-volley (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

যদিও আপনার প্রকৃত প্রতিক্রিয়ার স্ট্রিংয়ের দৈর্ঘ্য = 28, সুতরাং স্ট্রিংয়ের দৈর্ঘ্য 500 অক্ষরের একটি স্ট্রিং তৈরি করতে যথেষ্ট দীর্ঘ নয়।

সমাধান:

  1. টার্নারি অপারেটর ব্যবহার করে দৈর্ঘ্য বৈধ করুন?:

    mTextView.setText("Response is: "+ 
       ((response.length()>499) ? response.substring(0,500) : "length is too short"));

    দ্রষ্টব্য: টেরানারি অপারেটর ( ?: :) if else সংক্ষিপ্ত প্রকাশ তবে এটি একটি বিবৃতি নয় মানে এটি কোনও পারমাণবিক বিবৃতি হিসাবে ঘটতে পারে না কারণ এটি INVALID কারণ কোনও অ্যাসাইনমেন্ট নেই 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 RuntimeException মানে IndexOutOfBoundsException এর একটি সাবক্লাস মানে এটি একটি চেক করা ব্যতিক্রম যা কোনও ধরণের সূচি (যেমন একটি অ্যারে, একটি স্ট্রিং বা ভেক্টরের কাছে) তালিকা ব্যবহার করে পরিসীমা ছাড়িয়ে চলেছে তা নির্দেশ করে।

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);
}

সূচিপত্রের অপসারণের অন্যান্য প্রকরণগুলি / উপ-শ্রেণিগুলি কোনটি?

  • 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 : এটি StringIndexOutOfBoundsException স্ট্রিংয়ের আকারের চেয়ে নেতিবাচক বা তার চেয়ে বড় is 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 , charAt ফাংশন সহ নেতিবাচক সূচকের ব্যবহার
  • বিগিনিয়ডেক্স 0 চেয়ে কম বা এন্ডআইডেক্স সূচিকাগুলি তৈরি করতে ইনপুট স্ট্রিংয়ের দৈর্ঘ্যের চেয়ে বড় বা আরম্ভের সূচকটি এন্ডআইডেক্সের চেয়ে বড়
  • যখন endIndex - beginIndex ফলাফল 0 চেয়ে কম হয়
  • যখন ইনপুট স্ট্রিং / অ্যারে খালি থাকে

তথ্য: জেভিএমের কাজ যথাযথ ব্যতিক্রমের অবজেক্ট তৈরি করা এবং এটি এমন জায়গায় পৌঁছে দেওয়া, যেখানে এটি throw কীওয়ার্ড ব্যবহার করে হয়েছিল বা আপনি নিজেও throw কীওয়ার্ড ব্যবহার করে নিজে করতে পারেন।

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

আমি এটা কিভাবে ঠিক করবো ?

  1. স্ট্যাকট্রেস বিশ্লেষণ
  2. শূন্যতা, দৈর্ঘ্য বা বৈধ সূচকের বিপরীতে ইনপুট স্ট্রিং বৈধকরণ
  3. ডিবাগিং বা লগগুলি ব্যবহার করা
  4. জেনেরিক ব্যতিক্রম ক্যাপ ব্লক ব্যবহার করে

1.) স্ট্যাকট্রেস বিশ্লেষণ

এই পোস্টের শুরুতে যেমন দেখানো হয়েছে, স্ট্যাকট্রেস প্রাথমিক বার্তাগুলিতে এটি কোথায় ঘটে, কেন ঘটে তা সম্পর্কে প্রয়োজনীয় তথ্য সরবরাহ করে যাতে আপনি কেবল সেই কোডটি সন্ধান করতে এবং প্রয়োজনীয় সমাধানটি প্রয়োগ করতে পারেন।

উদাহরণস্বরূপ StringIndexOutOfBoundsException কারণ এবং তারপরে আপনার package name indicating your class file তারপরে সেই লাইনে যান এবং কারণটি মাথায় রেখে, কেবল সমাধানটি প্রয়োগ করুন

আপনি যদি ব্যতিক্রম এবং এর কারণ সম্পর্কে পাশাপাশি ডকুমেন্টেশনে অধ্যয়ন করেন তবে এটি একটি প্রধান সূচনা।

২) নালিয়া, দৈর্ঘ্য বা বৈধ সূচকগুলির বিপক্ষে ইনপুট স্ট্রিং বৈধকরণ

অনিশ্চয়তার ক্ষেত্রে যখন আপনি জানেন না যে সার্ভার থেকে প্রতিক্রিয়া আসার মতো প্রকৃত ইনপুট (বা সম্ভবত এটি একটি ত্রুটি বা কিছুই নয়) বা ব্যবহারকারী তখন সব অপ্রত্যাশিত ক্ষেত্রে আবরণ করা সর্বদা ভাল তবে আমার বিশ্বাস কিছু সংখ্যক ব্যবহারকারী সর্বদা চাপ দিতে পছন্দ করেন পরীক্ষার সীমাবদ্ধতা সুতরাং input!=null && input.length()>0 ব্যবহার input!=null && input.length()>0 বা সূচীগুলির জন্য, আপনি input!=null && input.length()>0 অপারেটর বা if-else সীমানা চেক শর্তাদি ব্যবহার করতে পারেন

৩) ডিবাগিং বা লগগুলি ব্যবহার করা

আপনার প্রকল্পের ব্রেক-পয়েন্ট যুক্ত করে আপনি আপনার প্রকল্পের চলমান পরিবেশটি ডিবাগ মোডে পরীক্ষা করতে পারেন এবং আপনার পরবর্তী ক্রিয়াটির জন্য অপেক্ষা করতে সেখানে থামবে এবং এর মধ্যে আপনি ভেরিয়েবলের মান এবং অন্যান্য বিশদটি সন্ধান করতে পারবেন।

লগগুলি চেক-পয়েন্টগুলির মতো হয় তাই যখন আপনার নিয়ন্ত্রণ এই পয়েন্টটি অতিক্রম করে তারা বিশদ জেনারেট করে, মূলত সেগুলি তথ্য সিস্টেম বা ব্যবহারকারী দ্বারা প্রদত্ত তথ্যমূলক বার্তাগুলি লগ বা মুদ্রণ বার্তা ব্যবহার করে লগিং বার্তা রাখতে পারে

৪) জেনেরিক ব্যতিক্রম ক্যাপ ব্লক ব্যবহার করে

RuntimeExceptions হ্যান্ডেল করার জন্য RuntimeExceptions Try-catch ব্লকগুলি সর্বদা কার্যকর হয় যাতে আপনি আপনার সম্ভাব্য সমস্যাগুলি পরিচালনা করতে এবং যথাযথ বিবরণ দিতে একাধিক 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 ");
}

আরও তথ্যসূত্র

নালপয়েন্টার এক্সসেপশন কী এবং আমি কীভাবে এটি ঠিক করব?

এটি আমার কোড:

    private void bringData() {
    final TextView mTextView = (TextView) findViewById(R.id.textView);

    // Instantiate the RequestQueue.
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://192.168.4.1:8080/";

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Display the first 500 characters of the response string.
                    mTextView.setText("Response is: "+ response.substring(0,500));
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mTextView.setText("That didn't work!");
        }
    });
    // Add the request to the RequestQueue.
    queue.add(stringRequest);
}

এটি অ্যান্ড্রয়েড ডকুমেন্টেশন থেকে প্রদত্ত ডিফল্ট। আমি কেবল ইউআরএল পরিবর্তন করেছি।

এটি আমার ত্রুটির বার্তা:

java.lang.StringIndexOutOfBoundsException: দৈর্ঘ্য = 28; regionStart = 1; অঞ্চলের দৈর্ঘ্য = 499 at java.lang.String.substring (স্ট্রিং.জভা ১৯৯১31) এ com.example.my.app.MainActivity $ 2.onResponse (মেইনএকটিভিটি.জভা:50) com.example.my.app.MainActivity $ 2 এ। com.android.volley.toolbox.StringRequest.deliverResponse (StringRequest.java:60) এ onResponse (MainActivity.java:46) com.android.volley.toolbox.StringRequest.deliverResponse। .volley.ExecutorDelivery $ android.os.Handler.handleCallback (Handler.java:751) এ android.os.Handler.dispatchMessage (Handler.java:os) এ এবং অ্যান্ড্রয়েড এ রেসপন্সডেলিভারিআরনএবল.আরুন (এক্সিকিউটারডেলিভারি.জভা: 99)। অ্যান্ড্রয়েড.এপ.অ্যাক্টিভিটি থ্রেড.মাইন (অ্যাক্টিভিটিথ্রেড.জভা: 6077) এ লুপার.লুপ (লুপার.জভা ১৫৫৪) com.android.intern.os.ZygoteInit $ এ নেটিভ পদ্ধতি) Com.android.intern.os.ZygoteInit.main (জাইগোটইনিট.জভা: 5৫৫) এ মেথডএন্ডআর্গসক্লেআরআরুন (জাইগোটআইনিট.জাভা: ৮৮65)

ডিবাগিংয়ের সময় আমি দেখতে পাই যে mTextView.setText("Response is: "+ response.substring(0,500)); আমার বার্তাটি আমাকে পৌঁছে দেওয়া হয়েছে তবে পাঠ্যদর্শনটি কখনই আপডেট হয় না এবং অ্যাপটি ক্র্যাশ হয়।

বিশেষত, এটি এখানে লুপার.জভা ফাইলের ভিতরে ক্রাশ হয়ে গেছে:

finally {
if (traceTag != 0) {
   Trace.traceEnd(traceTag);
} 

ট্রেসট্যাগ 0 হয়।

আমি পড়েছি যে কিছু স্ট্রিং সীমানা ভুল তবে এটি কীভাবে ঠিক করা যায় তা আমি খুঁজে পাচ্ছি না।





android-volley